Billpeng Space

技术源自生活
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

T-SQL MD5算法实现

Posted on 2009-02-08 20:00  billpeng  阅读(512)  评论(0编辑  收藏  举报
函数代码:
/*****************************************************************************
* Name: T-SQL MD5算法实现
* Author: Rambo Qian
* Create Date: 2003-04-10
* Last Modified by: Rambo Qian
* Last Update Date: 2003-04-16
* Version: V1.0.00
****************************************************************************
*/
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_m_OnBits]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_m_OnBits]
GO
/*****************************************************************************
* Name: MD5_m_OnBits
* Description: 常数组
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_m_OnBits(
@i TINYINT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
DECLARE @iRes INT
SELECT @iRes =
CASE @i
WHEN 0 THEN 1 -- 00000000000000000000000000000001
WHEN 1 THEN 3 -- 00000000000000000000000000000011
WHEN 2 THEN 7 -- 00000000000000000000000000000111
WHEN 3 THEN 15 -- 00000000000000000000000000001111
WHEN 4 THEN 31 -- 00000000000000000000000000011111
WHEN 5 THEN 63 -- 00000000000000000000000000111111
WHEN 6 THEN 127 -- 00000000000000000000000001111111
WHEN 7 THEN 255 -- 00000000000000000000000011111111
WHEN 8 THEN 511 -- 00000000000000000000000111111111
WHEN 9 THEN 1023 -- 00000000000000000000001111111111
WHEN 10 THEN 2047 -- 00000000000000000000011111111111
WHEN 11 THEN 4095 -- 00000000000000000000111111111111
WHEN 12 THEN 8191 -- 00000000000000000001111111111111
WHEN 13 THEN 16383 -- 00000000000000000011111111111111
WHEN 14 THEN 32767 -- 00000000000000000111111111111111
WHEN 15 THEN 65535 -- 00000000000000001111111111111111
WHEN 16 THEN 131071 -- 00000000000000011111111111111111
WHEN 17 THEN 262143 -- 00000000000000111111111111111111
WHEN 18 THEN 524287 -- 00000000000001111111111111111111
WHEN 19 THEN 1048575 -- 00000000000011111111111111111111
WHEN 20 THEN 2097151 -- 00000000000111111111111111111111
WHEN 21 THEN 4194303 -- 00000000001111111111111111111111
WHEN 22 THEN 8388607 -- 00000000011111111111111111111111
WHEN 23 THEN 16777215 -- 00000000111111111111111111111111
WHEN 24 THEN 33554431 -- 00000001111111111111111111111111
WHEN 25 THEN 67108863 -- 00000011111111111111111111111111
WHEN 26 THEN 134217727 -- 00000111111111111111111111111111
WHEN 27 THEN 268435455 -- 00001111111111111111111111111111
WHEN 28 THEN 536870911 -- 00011111111111111111111111111111
WHEN 29 THEN 1073741823 -- 00111111111111111111111111111111
WHEN 30 THEN 2147483647 -- 01111111111111111111111111111111
ELSE 0
END
RETURN(@iRes)
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_m_2Power]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_m_2Power]
GO
/*****************************************************************************
* Name: MD5_m_2Power
* Description: 常数组
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_m_2Power(
@i TINYINT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
DECLARE @iRes INT
SELECT @iRes =
CASE @i
WHEN 0 THEN 1 -- 00000000000000000000000000000001
WHEN 1 THEN 2 -- 00000000000000000000000000000010
WHEN 2 THEN 4 -- 00000000000000000000000000000100
WHEN 3 THEN 8 -- 00000000000000000000000000001000
WHEN 4 THEN 16 -- 00000000000000000000000000010000
WHEN 5 THEN 32 -- 00000000000000000000000000100000
WHEN 6 THEN 64 -- 00000000000000000000000001000000
WHEN 7 THEN 128 -- 00000000000000000000000010000000
WHEN 8 THEN 256 -- 00000000000000000000000100000000
WHEN 9 THEN 512 -- 00000000000000000000001000000000
WHEN 10 THEN 1024 -- 00000000000000000000010000000000
WHEN 11 THEN 2048 -- 00000000000000000000100000000000
WHEN 12 THEN 4096 -- 00000000000000000001000000000000
WHEN 13 THEN 8192 -- 00000000000000000010000000000000
WHEN 14 THEN 16384 -- 00000000000000000100000000000000
WHEN 15 THEN 32768 -- 00000000000000001000000000000000
WHEN 16 THEN 65536 -- 00000000000000010000000000000000
WHEN 17 THEN 131072 -- 00000000000000100000000000000000
WHEN 18 THEN 262144 -- 00000000000001000000000000000000
WHEN 19 THEN 524288 -- 00000000000010000000000000000000
WHEN 20 THEN 1048576 -- 00000000000100000000000000000000
WHEN 21 THEN 2097152 -- 00000000001000000000000000000000
WHEN 22 THEN 4194304 -- 00000000010000000000000000000000
WHEN 23 THEN 8388608 -- 00000000100000000000000000000000
WHEN 24 THEN 16777216 -- 00000001000000000000000000000000
WHEN 25 THEN 33554432 -- 00000010000000000000000000000000
WHEN 26 THEN 67108864 -- 00000100000000000000000000000000
WHEN 27 THEN 134217728 -- 00001000000000000000000000000000
WHEN 28 THEN 268435456 -- 00010000000000000000000000000000
WHEN 29 THEN 536870912 -- 00100000000000000000000000000000
WHEN 30 THEN 1073741824 -- 01000000000000000000000000000000
ELSE 0
END
RETURN(@iRes)
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_LShift]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_LShift]
GO
/*****************************************************************************
* Name: MD5_LShift
* Description: MD5_LShift
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_LShift(
@iValue INT
,
@iShiftBits TINYINT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
DECLARE @iRes BIGINT
SET @iRes = CAST(@iValue AS BINARY(8))
SET @iRes = @iRes * dbo.MD5_m_2Power(@iShiftBits)
RETURN(CAST(@iRes & 0x00000000FFFFFFFF AS BINARY(4)))
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_RShift]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_RShift]
GO
/*****************************************************************************
* Name: MD5_RShift
* Description: MD5_RShift
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_RShift(
@iValue INT
,
@iShiftBits TINYINT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
DECLARE @iRes BIGINT
SET @iRes = CAST(@iValue AS BINARY(8))
SET @iRes = @iRes / dbo.MD5_m_2Power(@iShiftBits)
RETURN(CAST(@iRes & 0x00000000FFFFFFFF AS BINARY(4)))
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_RotateLeft]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_RotateLeft]
GO
/*****************************************************************************
* Name: MD5_RotateLeft
* Description: MD5_RotateLeft
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_RotateLeft(
@iValue INT
,
@iShiftBits TINYINT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
RETURN(dbo.MD5_LShift(@iValue@iShiftBits| dbo.MD5_RShift(@iValue, (32 - @iShiftBits)))
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_AddUnsigned]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_AddUnsigned]
GO
/*****************************************************************************
* Name: MD5_AddUnsigned
* Description: MD5_AddUnsigned
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_AddUnsigned(
@iX INT
,
@iY INT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
DECLARE @iRes BIGINT
SET @iRes = CAST(CAST(@iX AS BINARY(8)) AS BIGINT+ CAST(CAST(@iY AS BINARY(8)) AS BIGINT)
RETURN(CAST(@iRes & 0x00000000FFFFFFFF AS BINARY(4)))
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_F]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_F]
GO
/*****************************************************************************
* Name: MD5_F
* Description: MD5_F
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_F(
@x INT
,
@y INT
,
@z INT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
RETURN((@x & @y| ((~@x& @z))
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_G]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_G]
GO
/*****************************************************************************
* Name: MD5_G
* Description: MD5_G
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_G(
@x INT
,
@y INT
,
@z INT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
RETURN((@x & @z| (@y & (~@z)))
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_H]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_H]
GO
/*****************************************************************************
* Name: MD5_H
* Description: MD5_H
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_H(
@x INT
,
@y INT
,
@z INT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
RETURN(@x ^ @y ^ @z)
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_I]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_I]
GO
/*****************************************************************************
* Name: MD5_I
* Description: MD5_I
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_I(
@x INT
,
@y INT
,
@z INT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
RETURN(@y ^ (@x | (~@z)))
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_FF]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_FF]
GO
/*****************************************************************************
* Name: MD5_FF
* Description: MD5_FF
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_FF(
@a INT
,
@b INT
,
@c INT
,
@d INT
,
@x INT
,
@s INT
,
@ac INT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
SET @a = dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_F(@b@c@d), @x), @ac))
SET @a = dbo.MD5_RotateLeft(@a@s)
SET @a = dbo.MD5_AddUnsigned(@a@b)
RETURN(@a)
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_GG]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_GG]
GO
/*****************************************************************************
* Name: MD5_GG
* Description: MD5_GG
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_GG(
@a INT
,
@b INT
,
@c INT
,
@d INT
,
@x INT
,
@s INT
,
@ac INT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
SET @a = dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_G(@b@c@d), @x), @ac))
SET @a = dbo.MD5_RotateLeft(@a@s)
SET @a = dbo.MD5_AddUnsigned(@a@b)
RETURN(@a)
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_HH]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_HH]
GO
/*****************************************************************************
* Name: MD5_HH
* Description: MD5_HH
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_HH(
@a INT
,
@b INT
,
@c INT
,
@d INT
,
@x INT
,
@s INT
,
@ac INT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
SET @a = dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_H(@b@c@d), @x), @ac))
SET @a = dbo.MD5_RotateLeft(@a@s)
SET @a = dbo.MD5_AddUnsigned(@a@b)
RETURN(@a)
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_II]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_II]
GO
/*****************************************************************************
* Name: MD5_II
* Description: MD5_II
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_II(
@a INT
,
@b INT
,
@c INT
,
@d INT
,
@x INT
,
@s INT
,
@ac INT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
SET @a = dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_I(@b@c@d), @x), @ac))
SET @a = dbo.MD5_RotateLeft(@a@s)
SET @a = dbo.MD5_AddUnsigned(@a@b)
RETURN(@a)
END
GO
IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_ConvertToWordArray]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_ConvertToWordArray]
GO
/*****************************************************************************
* Name: MD5_ConvertToWordArray
* Description: MD5_ConvertToWordArray
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_ConvertToWordArray(
@sOrigMess VARCHAR(8000= ''
)
RETURNS @tWordArray TABLE([ID] INT IDENTITY(0,1),[Word] INT)
WITH ENCRYPTION
AS
BEGIN
IF @sOrigMess IS NULL
SET @sOrigMess = ''

DECLARE @iLenOfMess INT
DECLARE @iWordArrayLen INT
DECLARE @iPosOfWord INT
DECLARE @iPosOfMess INT
DECLARE @iCountOfWord INT

SET @iLenOfMess = LEN(@sOrigMess)
SET @iWordArrayLen = ((@iLenOfMess + 8)/64 + 1* 16
SET @iCountOfWord = 0
WHILE(@iCountOfWord<@iWordArrayLen)
BEGIN
INSERT INTO @tWordArray([Word]VALUES(0)
SET @iCountOfWord = @iCountOfWord + 1
END

SELECT @iPosOfMess = 0@iPosOfWord = 0@iCountOfWord = 0
WHILE(@iPosOfMess < @iLenOfMess)
BEGIN
SELECT @iCountOfWord = @iPosOfMess / 4@iPosOfWord = @iPosOfMess % 4
UPDATE @tWordArray
SET [Word] = [Word] | dbo.MD5_LShift(UNICODE(SUBSTRING(@sOrigMess,@iPosOfMess+1,1)),@iPosOfWord*8)
WHERE [ID] = @iCountOfWord
SET @iPosOfMess = @iPosOfMess + 1
END

SELECT @iCountOfWord = @iPosOfMess / 4@iPosOfWord = @iPosOfMess % 4
UPDATE @tWordArray
SET [Word] = [Word] | dbo.MD5_LShift(0x80,@iPosOfWord*8)
WHERE [ID] = @iCountOfWord

UPDATE @tWordArray
SET [Word] = [Word] | dbo.MD5_LShift(@iLenOfMess,3)
WHERE [ID] = @iWordArrayLen - 2
UPDATE @tWordArray
SET [Word] = [Word] | dbo.MD5_RShift(@iLenOfMess,29)
WHERE [ID] = @iWordArrayLen - 1
RETURN
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_WordToHex]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5_WordToHex]
GO
/*****************************************************************************
* Name: MD5_WordToHex
* Description: MD5_WordToHex
****************************************************************************
*/
CREATE FUNCTION dbo.MD5_WordToHex(
@iValue INT
)
RETURNS CHAR(8)
WITH ENCRYPTION
AS
BEGIN
DECLARE @sRes VARCHAR(8)
DECLARE @iTmp INT
DECLARE @iCount TINYINT

SELECT @sRes = ''@iCount = 0
WHILE(@iCount<4)
BEGIN
SET @iTmp = dbo.MD5_RShift(@iValue,@iCount*8& 0x000000FF
SET @sRes = @sRes + CASE @iTmp / 16 WHEN 0 THEN '0'
WHEN 1 THEN '1'
WHEN 2 THEN '2'
WHEN 3 THEN '3'
WHEN 4 THEN '4'
WHEN 5 THEN '5'
WHEN 6 THEN '6'
WHEN 7 THEN '7'
WHEN 8 THEN '8'
WHEN 9 THEN '9'
WHEN 10 THEN 'A'
WHEN 11 THEN 'B'
WHEN 12 THEN 'C'
WHEN 13 THEN 'D'
WHEN 14 THEN 'E'
WHEN 15 THEN 'F'
ELSE '' END
+ CASE @iTmp % 16 WHEN 0 THEN '0'
WHEN 1 THEN '1'
WHEN 2 THEN '2'
WHEN 3 THEN '3'
WHEN 4 THEN '4'
WHEN 5 THEN '5'
WHEN 6 THEN '6'
WHEN 7 THEN '7'
WHEN 8 THEN '8'
WHEN 9 THEN '9'
WHEN 10 THEN 'A'
WHEN 11 THEN 'B'
WHEN 12 THEN 'C'
WHEN 13 THEN 'D'
WHEN 14 THEN 'E'
WHEN 15 THEN 'F'
ELSE '' END
SET @iCount = @iCount + 1
END
RETURN(@sRes)
END
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5]'AND xtype IN(N'FN', N'IF', N'TF'))
DROP FUNCTION [dbo].[MD5]
GO
/*****************************************************************************
* Name: MD5
* Description: MD5
****************************************************************************
*/
CREATE FUNCTION dbo.MD5(
@sOrigMess NVARCHAR(4000)
)
RETURNS CHAR(32)
WITH ENCRYPTION
AS
BEGIN
--====================================
DECLARE @S11 TINYINT
DECLARE @S12 TINYINT
DECLARE @S13 TINYINT
DECLARE @S14 TINYINT
DECLARE @S21 TINYINT
DECLARE @S22 TINYINT
DECLARE @S23 TINYINT
DECLARE @S24 TINYINT
DECLARE @S31 TINYINT
DECLARE @S32 TINYINT
DECLARE @S33 TINYINT
DECLARE @S34 TINYINT
DECLARE @S41 TINYINT
DECLARE @S42 TINYINT
DECLARE @S43 TINYINT
DECLARE @S44 TINYINT

SELECT @S11 = 7@S12 = 12@S13 = 17@S14 = 22
SELECT @S21 = 5@S22 = 9@S23 = 14@S24 = 20
SELECT @S31 = 4@S32 = 11@S33 = 16@S34 = 23
SELECT @S41 = 6@S42 = 10@S43 = 15@S44 = 21
--====================================
DECLARE @a INT
DECLARE @b INT
DECLARE @c INT
DECLARE @d INT
DECLARE @AA INT
DECLARE @BB INT
DECLARE @CC INT
DECLARE @DD INT

SELECT @a = 0x67452301
,
@b = 0xEFCDAB89
,
@c = 0x98BADCFE
,
@d = 0x10325476
--====================================
DECLARE @sRes VARCHAR(32)
SET @sRes = ''
DECLARE @iWordArrayLen INT
DECLARE @iWordArrayCount INT

DECLARE @tTmp TABLE([ID] INT[Word] INT)
INSERT INTO @tTmp SELECT * FROM dbo.MD5_ConvertToWordArray(@sOrigMess)
SELECT @iWordArrayCount=0@iWordArrayLen = COUNT(*FROM @tTmp

WHILE(@iWordArrayCount < @iWordArrayLen)
BEGIN
SELECT @AA = @a@BB = @b@CC = @c@DD = @d

SELECT @a = dbo.MD5_FF(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S110xD76AA478)
SELECT @d = dbo.MD5_FF(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S120xE8C7B756)
SELECT @c = dbo.MD5_FF(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S130x242070DB)
SELECT @b = dbo.MD5_FF(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S140xC1BDCEEE)
SELECT @a = dbo.MD5_FF(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S110xF57C0FAF)
SELECT @d = dbo.MD5_FF(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S120x4787C62A)
SELECT @c = dbo.MD5_FF(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S130xA8304613)
SELECT @b = dbo.MD5_FF(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S140xFD469501)
SELECT @a = dbo.MD5_FF(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S110x698098D8)
SELECT @d = dbo.MD5_FF(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S120x8B44F7AF)
SELECT @c = dbo.MD5_FF(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S130xFFFF5BB1)
SELECT @b = dbo.MD5_FF(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S140x895CD7BE)
SELECT @a = dbo.MD5_FF(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S110x6B901122)
SELECT @d = dbo.MD5_FF(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S120xFD987193)
SELECT @c = dbo.MD5_FF(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S130xA679438E)
SELECT @b = dbo.MD5_FF(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S140x49B40821)

SELECT @a = dbo.MD5_GG(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S210xF61E2562)
SELECT @d = dbo.MD5_GG(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S220xC040B340)
SELECT @c = dbo.MD5_GG(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S230x265E5A51)
SELECT @b = dbo.MD5_GG(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S240xE9B6C7AA)
SELECT @a = dbo.MD5_GG(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S210xD62F105D)
SELECT @d = dbo.MD5_GG(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S220x2441453)
SELECT @c = dbo.MD5_GG(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S230xD8A1E681)
SELECT @b = dbo.MD5_GG(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S240xE7D3FBC8)
SELECT @a = dbo.MD5_GG(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S210x21E1CDE6)
SELECT @d = dbo.MD5_GG(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S220xC33707D6)
SELECT @c = dbo.MD5_GG(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S230xF4D50D87)
SELECT @b = dbo.MD5_GG(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S240x455A14ED)
SELECT @a = dbo.MD5_GG(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S210xA9E3E905)
SELECT @d = dbo.MD5_GG(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S220xFCEFA3F8)
SELECT @c = dbo.MD5_GG(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S230x676F02D9)
SELECT @b = dbo.MD5_GG(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S240x8D2A4C8A)

SELECT @a = dbo.MD5_HH(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S310xFFFA3942)
SELECT @d = dbo.MD5_HH(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S320x8771F681)
SELECT @c = dbo.MD5_HH(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S330x6D9D6122)
SELECT @b = dbo.MD5_HH(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S340xFDE5380C)
SELECT @a = dbo.MD5_HH(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S310xA4BEEA44)
SELECT @d = dbo.MD5_HH(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S320x4BDECFA9)
SELECT @c = dbo.MD5_HH(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S330xF6BB4B60)
SELECT @b = dbo.MD5_HH(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S340xBEBFBC70)
SELECT @a = dbo.MD5_HH(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S310x289B7EC6)
SELECT @d = dbo.MD5_HH(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S320xEAA127FA)
SELECT @c = dbo.MD5_HH(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S330xD4EF3085)
SELECT @b = dbo.MD5_HH(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S340x4881D05)
SELECT @a = dbo.MD5_HH(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S310xD9D4D039)
SELECT @d = dbo.MD5_HH(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S320xE6DB99E5)
SELECT @c = dbo.MD5_HH(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S330x1FA27CF8)
SELECT @b = dbo.MD5_HH(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S340xC4AC5665)

SELECT @a = dbo.MD5_II(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S410xF4292244)
SELECT @d = dbo.MD5_II(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S420x432AFF97)
SELECT @c = dbo.MD5_II(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S430xAB9423A7)
SELECT @b = dbo.MD5_II(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S440xFC93A039)
SELECT @a = dbo.MD5_II(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S410x655B59C3)
SELECT @d = dbo.MD5_II(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S420x8F0CCC92)
SELECT @c = dbo.MD5_II(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S430xFFEFF47D)
SELECT @b = dbo.MD5_II(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S440x85845DD1)
SELECT @a = dbo.MD5_II(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S410x6FA87E4F)
SELECT @d = dbo.MD5_II(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S420xFE2CE6E0)
SELECT @c = dbo.MD5_II(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S430xA3014314)
SELECT @b = dbo.MD5_II(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S440x4E0811A1)
SELECT @a = dbo.MD5_II(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S410xF7537E82)
SELECT @d = dbo.MD5_II(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S420xBD3AF235)
SELECT @c = dbo.MD5_II(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S430x2AD7D2BB)
SELECT @b = dbo.MD5_II(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S440xEB86D391)

SET @a = dbo.MD5_AddUnsigned(@a@AA)
SET @b = dbo.MD5_AddUnsigned(@b@BB)
SET @c = dbo.MD5_AddUnsigned(@c@CC)
SET @d = dbo.MD5_AddUnsigned(@d@DD)

SET @iWordArrayCount = @iWordArrayCount + 16
END

SET @sRes = dbo.MD5_WordToHex(@a+ dbo.MD5_WordToHex(@b+ dbo.MD5_WordToHex(@c+ dbo.MD5_WordToHex(@d)
SET @sRes = LOWER(@sRes)
RETURN(@sRes)
END
GO

使用方法: select dbo.MD5('admin') as adminField