SQL Server中的MD5实现方法
/*****************************************************************************
* 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
/*****************************************************************************
* 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
/*****************************************************************************
* 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
/*****************************************************************************
* 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
/*****************************************************************************
* 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
/*****************************************************************************
* 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
/*****************************************************************************
* 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
/*****************************************************************************
* 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
/*****************************************************************************
* 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
/*****************************************************************************
* 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
/*****************************************************************************
* 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
/*****************************************************************************
* 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
/*****************************************************************************
* 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
/*****************************************************************************
* 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
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
BEGIN
INSERT INTO @tWordArray([Word]) VALUES(0)
SET @iCountOfWord = @iCountOfWord + 1
END
SELECT @iPosOfMess = 0, @iPosOfWord = 0, @iCountOfWord = 0
WHILE(&#64;iPosOfMess <&#64;iLenOfMess)
BEGIN
SELECT &#64;iCountOfWord &#61; &#64;iPosOfMess / 4, &#64;iPosOfWord &#61; &#64;iPosOfMess % 4
UPDATE &#64;tWordArray
SET [Word] &#61; [Word] | dbo.MD5_LShift(UNICODE(SUBSTRING(&#64;sOrigMess,&#64;iPosOfMess&#43;1,1)),&#64;iPosOfWord*8)
WHERE [ID] &#61; &#64;iCountOfWord
SET &#64;iPosOfMess &#61; &#64;iPosOfMess &#43; 1
END
SELECT &#64;iCountOfWord &#61; &#64;iPosOfMess / 4, &#64;iPosOfWord &#61; &#64;iPosOfMess % 4
UPDATE &#64;tWordArray
SET [Word] &#61; [Word] | dbo.MD5_LShift(0x80,&#64;iPosOfWord*8)
WHERE [ID] &#61; &#64;iCountOfWord
UPDATE &#64;tWordArray
SET [Word] &#61; [Word] | dbo.MD5_LShift(&#64;iLenOfMess,3)
WHERE [ID] &#61; &#64;iWordArrayLen - 2
UPDATE &#64;tWordArray
SET [Word] &#61; [Word] | dbo.MD5_RShift(&#64;iLenOfMess,29)
WHERE [ID] &#61; &#64;iWordArrayLen - 1
RETURN
END
GO
/*****************************************************************************
* Name: MD5_WordToHex
* Description: MD5_WordToHex
*****************************************************************************/
CREATE FUNCTION dbo.MD5_WordToHex(
&#64;iValue INT
)
RETURNS CHAR(8)
WITH ENCRYPTION
AS
BEGIN
DECLARE &#64;sRes VARCHAR(8)
DECLARE &#64;iTmp INT
DECLARE &#64;iCount TINYINT
SELECT &#64;sRes &#61; &#39;&#39;, &#64;iCount &#61; 0
WHILE(&#64;iCount<4)
BEGIN
SET &#64;iTmp &#61; dbo.MD5_RShift(&#64;iValue,&#64;iCount*8) & 0x000000FF
SET &#64;sRes &#61; &#64;sRes &#43; CASE &#64;iTmp / 16 WHEN 0 THEN &#39;0&#39;
WHEN 1 THEN &#39;1&#39;
WHEN 2 THEN &#39;2&#39;
WHEN 3 THEN &#39;3&#39;
WHEN 4 THEN &#39;4&#39;
WHEN 5 THEN &#39;5&#39;
WHEN 6 THEN &#39;6&#39;
WHEN 7 THEN &#39;7&#39;
WHEN 8 THEN &#39;8&#39;
WHEN 9 THEN &#39;9&#39;
WHEN 10 THEN &#39;A&#39;
WHEN 11 THEN &#39;B&#39;
WHEN 12 THEN &#39;C&#39;
WHEN 13 THEN &#39;D&#39;
WHEN 14 THEN &#39;E&#39;
WHEN 15 THEN &#39;F&#39;
ELSE &#39;&#39; END
&#43; CASE &#64;iTmp % 16 WHEN 0 THEN &#39;0&#39;
WHEN 1 THEN &#39;1&#39;
WHEN 2 THEN &#39;2&#39;
WHEN 3 THEN &#39;3&#39;
WHEN 4 THEN &#39;4&#39;
WHEN 5 THEN &#39;5&#39;
WHEN 6 THEN &#39;6&#39;
WHEN 7 THEN &#39;7&#39;
WHEN 8 THEN &#39;8&#39;
WHEN 9 THEN &#39;9&#39;
WHEN 10 THEN &#39;A&#39;
WHEN 11 THEN &#39;B&#39;
WHEN 12 THEN &#39;C&#39;
WHEN 13 THEN &#39;D&#39;
WHEN 14 THEN &#39;E&#39;
WHEN 15 THEN &#39;F&#39;
ELSE &#39;&#39; END
SET &#64;iCount &#61; &#64;iCount &#43; 1
END
RETURN(&#64;sRes)
END
GO
/*****************************************************************************
* Name: MD5
* Description: MD5
*****************************************************************************/
CREATE FUNCTION dbo.MD5(
&#64;sOrigMess NVARCHAR(4000)
)
RETURNS CHAR(32)
WITH ENCRYPTION
AS
BEGIN
--&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
DECLARE &#64;S11 TINYINT
DECLARE &#64;S12 TINYINT
DECLARE &#64;S13 TINYINT
DECLARE &#64;S14 TINYINT
DECLARE &#64;S21 TINYINT
DECLARE &#64;S22 TINYINT
DECLARE &#64;S23 TINYINT
DECLARE &#64;S24 TINYINT
DECLARE &#64;S31 TINYINT
DECLARE &#64;S32 TINYINT
DECLARE &#64;S33 TINYINT
DECLARE &#64;S34 TINYINT
DECLARE &#64;S41 TINYINT
DECLARE &#64;S42 TINYINT
DECLARE &#64;S43 TINYINT
DECLARE &#64;S44 TINYINT
SELECT &#64;S11 &#61; 7, &#64;S12 &#61; 12, &#64;S13 &#61; 17, &#64;S14 &#61; 22
SELECT &#64;S21 &#61; 5, &#64;S22 &#61; 9, &#64;S23 &#61; 14, &#64;S24 &#61; 20
SELECT &#64;S31 &#61; 4, &#64;S32 &#61; 11, &#64;S33 &#61; 16, &#64;S34 &#61; 23
SELECT &#64;S41 &#61; 6, &#64;S42 &#61; 10, &#64;S43 &#61; 15, &#64;S44 &#61; 21
--&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
DECLARE &#64;a INT
DECLARE &#64;b INT
DECLARE &#64;c INT
DECLARE &#64;d INT
DECLARE &#64;AA INT
DECLARE &#64;BB INT
DECLARE &#64;CC INT
DECLARE &#64;DD INT
SELECT &#64;a &#61; 0x67452301
,&#64;b &#61; 0xEFCDAB89
,&#64;c &#61; 0x98BADCFE
,&#64;d &#61; 0x10325476
--&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
DECLARE &#64;sRes VARCHAR(32)
SET &#64;sRes &#61; &#39;&#39;
DECLARE &#64;iWordArrayLen INT
DECLARE &#64;iWordArrayCount INT
DECLARE &#64;tTmp TABLE([ID] INT, [Word] INT)
INSERT INTO &#64;tTmp SELECT * FROM dbo.MD5_ConvertToWordArray(&#64;sOrigMess)
SELECT &#64;iWordArrayCount&#61;0, &#64;iWordArrayLen &#61; COUNT(*) FROM &#64;tTmp
WHILE(&#64;iWordArrayCount <&#64;iWordArrayLen)
BEGIN
SELECT &#64;AA &#61; &#64;a, &#64;BB &#61; &#64;b, &#64;CC &#61; &#64;c, &#64;DD &#61; &#64;d
SELECT &#64;a &#61; dbo.MD5_FF(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 0), &#64;S11, 0xD76AA478)
SELECT &#64;d &#61; dbo.MD5_FF(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 1), &#64;S12, 0xE8C7B756)
SELECT &#64;c &#61; dbo.MD5_FF(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 2), &#64;S13, 0x242070DB)
SELECT &#64;b &#61; dbo.MD5_FF(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 3), &#64;S14, 0xC1BDCEEE)
SELECT &#64;a &#61; dbo.MD5_FF(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 4), &#64;S11, 0xF57C0FAF)
SELECT &#64;d &#61; dbo.MD5_FF(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 5), &#64;S12, 0x4787C62A)
SELECT &#64;c &#61; dbo.MD5_FF(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 6), &#64;S13, 0xA8304613)
SELECT &#64;b &#61; dbo.MD5_FF(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 7), &#64;S14, 0xFD469501)
SELECT &#64;a &#61; dbo.MD5_FF(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 8), &#64;S11, 0x698098D8)
SELECT &#64;d &#61; dbo.MD5_FF(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 9), &#64;S12, 0x8B44F7AF)
SELECT &#64;c &#61; dbo.MD5_FF(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 10), &#64;S13, 0xFFFF5BB1)
SELECT &#64;b &#61; dbo.MD5_FF(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 11), &#64;S14, 0x895CD7BE)
SELECT &#64;a &#61; dbo.MD5_FF(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 12), &#64;S11, 0x6B901122)
SELECT &#64;d &#61; dbo.MD5_FF(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 13), &#64;S12, 0xFD987193)
SELECT &#64;c &#61; dbo.MD5_FF(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 14), &#64;S13, 0xA679438E)
SELECT &#64;b &#61; dbo.MD5_FF(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 15), &#64;S14, 0x49B40821)
SELECT &#64;a &#61; dbo.MD5_GG(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 1), &#64;S21, 0xF61E2562)
SELECT &#64;d &#61; dbo.MD5_GG(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 6), &#64;S22, 0xC040B340)
SELECT &#64;c &#61; dbo.MD5_GG(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 11), &#64;S23, 0x265E5A51)
SELECT &#64;b &#61; dbo.MD5_GG(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 0), &#64;S24, 0xE9B6C7AA)
SELECT &#64;a &#61; dbo.MD5_GG(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 5), &#64;S21, 0xD62F105D)
SELECT &#64;d &#61; dbo.MD5_GG(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 10), &#64;S22, 0x2441453)
SELECT &#64;c &#61; dbo.MD5_GG(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 15), &#64;S23, 0xD8A1E681)
SELECT &#64;b &#61; dbo.MD5_GG(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 4), &#64;S24, 0xE7D3FBC8)
SELECT &#64;a &#61; dbo.MD5_GG(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 9), &#64;S21, 0x21E1CDE6)
SELECT &#64;d &#61; dbo.MD5_GG(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 14), &#64;S22, 0xC33707D6)
SELECT &#64;c &#61; dbo.MD5_GG(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 3), &#64;S23, 0xF4D50D87)
SELECT &#64;b &#61; dbo.MD5_GG(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 8), &#64;S24, 0x455A14ED)
SELECT &#64;a &#61; dbo.MD5_GG(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 13), &#64;S21, 0xA9E3E905)
SELECT &#64;d &#61; dbo.MD5_GG(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 2), &#64;S22, 0xFCEFA3F8)
SELECT &#64;c &#61; dbo.MD5_GG(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 7), &#64;S23, 0x676F02D9)
SELECT &#64;b &#61; dbo.MD5_GG(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 12), &#64;S24, 0x8D2A4C8A)
SELECT &#64;a &#61; dbo.MD5_HH(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 5), &#64;S31, 0xFFFA3942)
SELECT &#64;d &#61; dbo.MD5_HH(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 8), &#64;S32, 0x8771F681)
SELECT &#64;c &#61; dbo.MD5_HH(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 11), &#64;S33, 0x6D9D6122)
SELECT &#64;b &#61; dbo.MD5_HH(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 14), &#64;S34, 0xFDE5380C)
SELECT &#64;a &#61; dbo.MD5_HH(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 1), &#64;S31, 0xA4BEEA44)
SELECT &#64;d &#61; dbo.MD5_HH(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 4), &#64;S32, 0x4BDECFA9)
SELECT &#64;c &#61; dbo.MD5_HH(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 7), &#64;S33, 0xF6BB4B60)
SELECT &#64;b &#61; dbo.MD5_HH(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 10), &#64;S34, 0xBEBFBC70)
SELECT &#64;a &#61; dbo.MD5_HH(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 13), &#64;S31, 0x289B7EC6)
SELECT &#64;d &#61; dbo.MD5_HH(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 0), &#64;S32, 0xEAA127FA)
SELECT &#64;c &#61; dbo.MD5_HH(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 3), &#64;S33, 0xD4EF3085)
SELECT &#64;b &#61; dbo.MD5_HH(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 6), &#64;S34, 0x4881D05)
SELECT &#64;a &#61; dbo.MD5_HH(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 9), &#64;S31, 0xD9D4D039)
SELECT &#64;d &#61; dbo.MD5_HH(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 12), &#64;S32, 0xE6DB99E5)
SELECT &#64;c &#61; dbo.MD5_HH(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 15), &#64;S33, 0x1FA27CF8)
SELECT &#64;b &#61; dbo.MD5_HH(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 2), &#64;S34, 0xC4AC5665)
SELECT &#64;a &#61; dbo.MD5_II(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 0), &#64;S41, 0xF4292244)
SELECT &#64;d &#61; dbo.MD5_II(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 7), &#64;S42, 0x432AFF97)
SELECT &#64;c &#61; dbo.MD5_II(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 14), &#64;S43, 0xAB9423A7)
SELECT &#64;b &#61; dbo.MD5_II(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 5), &#64;S44, 0xFC93A039)
SELECT &#64;a &#61; dbo.MD5_II(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 12), &#64;S41, 0x655B59C3)
SELECT &#64;d &#61; dbo.MD5_II(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 3), &#64;S42, 0x8F0CCC92)
SELECT &#64;c &#61; dbo.MD5_II(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 10), &#64;S43, 0xFFEFF47D)
SELECT &#64;b &#61; dbo.MD5_II(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 1), &#64;S44, 0x85845DD1)
SELECT &#64;a &#61; dbo.MD5_II(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 8), &#64;S41, 0x6FA87E4F)
SELECT &#64;d &#61; dbo.MD5_II(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 15), &#64;S42, 0xFE2CE6E0)
SELECT &#64;c &#61; dbo.MD5_II(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 6), &#64;S43, 0xA3014314)
SELECT &#64;b &#61; dbo.MD5_II(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 13), &#64;S44, 0x4E0811A1)
SELECT &#64;a &#61; dbo.MD5_II(&#64;a, &#64;b, &#64;c, &#64;d, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 4), &#64;S41, 0xF7537E82)
SELECT &#64;d &#61; dbo.MD5_II(&#64;d, &#64;a, &#64;b, &#64;c, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 11), &#64;S42, 0xBD3AF235)
SELECT &#64;c &#61; dbo.MD5_II(&#64;c, &#64;d, &#64;a, &#64;b, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 2), &#64;S43, 0x2AD7D2BB)
SELECT &#64;b &#61; dbo.MD5_II(&#64;b, &#64;c, &#64;d, &#64;a, (SELECT [Word] FROM &#64;tTmp WHERE [ID] &#61; &#64;iWordArrayCount &#43; 9), &#64;S44, 0xEB86D391)
SET &#64;a &#61; dbo.MD5_AddUnsigned(&#64;a, &#64;AA)
SET &#64;b &#61; dbo.MD5_AddUnsigned(&#64;b, &#64;BB)
SET &#64;c &#61; dbo.MD5_AddUnsigned(&#64;c, &#64;CC)
SET &#64;d &#61; dbo.MD5_AddUnsigned(&#64;d, &#64;DD)
SET &#64;iWordArrayCount &#61; &#64;iWordArrayCount &#43; 16
END
SET &#64;sRes &#61; dbo.MD5_WordToHex(&#64;a) &#43; dbo.MD5_WordToHex(&#64;b) &#43; dbo.MD5_WordToHex(&#64;c) &#43; dbo.MD5_WordToHex(&#64;d)
SET &#64;sRes &#61; LOWER(&#64;sRes)
RETURN(&#64;sRes)
END
GO