MD5Ëã·¨µÄT-SQLʵÏÖ(FOR SQL2000)£¨¶þ£©

×÷Õߣº²»Ïê À´Ô´£º ÈÕÆÚ£º2005-11-1

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), @S11, 0xD76AA478)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_FF(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S12, 0xE8C7B756)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_FF(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S13, 0x242070DB)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_FF(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S14, 0xC1BDCEEE)
¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_FF(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S11, 0xF57C0FAF)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_FF(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S12, 0x4787C62A)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_FF(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S13, 0xA8304613)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_FF(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S14, 0xFD469501)
¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_FF(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S11, 0x698098D8)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_FF(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S12, 0x8B44F7AF)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_FF(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S13, 0xFFFF5BB1)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_FF(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S14, 0x895CD7BE)
¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_FF(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S11, 0x6B901122)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_FF(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S12, 0xFD987193)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_FF(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S13, 0xA679438E)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_FF(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S14, 0x49B40821)

¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_GG(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S21, 0xF61E2562)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_GG(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S22, 0xC040B340)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_GG(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S23, 0x265E5A51)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_GG(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S24, 0xE9B6C7AA)
¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_GG(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S21, 0xD62F105D)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_GG(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S22, 0x2441453)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_GG(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S23, 0xD8A1E681)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_GG(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S24, 0xE7D3FBC8)
¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_GG(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S21, 0x21E1CDE6)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_GG(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S22, 0xC33707D6)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_GG(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S23, 0xF4D50D87)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_GG(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S24, 0x455A14ED)
¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_GG(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S21, 0xA9E3E905)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_GG(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S22, 0xFCEFA3F8)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_GG(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S23, 0x676F02D9)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_GG(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S24, 0x8D2A4C8A)

¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_HH(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S31, 0xFFFA3942)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_HH(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S32, 0x8771F681)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_HH(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S33, 0x6D9D6122)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_HH(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S34, 0xFDE5380C)
¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_HH(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S31, 0xA4BEEA44)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_HH(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S32, 0x4BDECFA9)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_HH(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S33, 0xF6BB4B60)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_HH(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S34, 0xBEBFBC70)
¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_HH(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S31, 0x289B7EC6)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_HH(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S32, 0xEAA127FA)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_HH(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S33, 0xD4EF3085)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_HH(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S34, 0x4881D05)
¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_HH(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S31, 0xD9D4D039)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_HH(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S32, 0xE6DB99E5)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_HH(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S33, 0x1FA27CF8)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_HH(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S34, 0xC4AC5665)

¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_II(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S41, 0xF4292244)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_II(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S42, 0x432AFF97)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_II(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S43, 0xAB9423A7)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_II(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S44, 0xFC93A039)
¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_II(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S41, 0x655B59C3)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_II(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S42, 0x8F0CCC92)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_II(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S43, 0xFFEFF47D)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_II(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S44, 0x85845DD1)
¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_II(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S41, 0x6FA87E4F)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_II(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S42, 0xFE2CE6E0)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_II(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S43, 0xA3014314)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_II(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S44, 0x4E0811A1)
¡¡¡¡¡¡¡¡SELECT @a = dbo.MD5_II(@a, @b, @c, @d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S41, 0xF7537E82)
¡¡¡¡¡¡¡¡SELECT @d = dbo.MD5_II(@d, @a, @b, @c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S42, 0xBD3AF235)
¡¡¡¡¡¡¡¡SELECT @c = dbo.MD5_II(@c, @d, @a, @b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S43, 0x2AD7D2BB)
¡¡¡¡¡¡¡¡SELECT @b = dbo.MD5_II(@b, @c, @d, @a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S44, 0xEB86D391)

¡¡¡¡¡¡¡¡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

--Test
set nocount on
select dbo.MD5('') as 'MD5('''')'
union
select 'd41d8cd98f00b204e9800998ecf8427e'

select dbo.MD5('a') as 'MD5(''a'')'
union
select '0cc175b9c0f1b6a831c399e269772661'

select dbo.MD5('abc') as 'MD5(''abc'')'
union
select '900150983cd24fb0d6963f7d28e17f72'

select dbo.MD5('message digest') as 'MD5(''message digest'')'
union
select 'f96b697d7cb7938d525a2f31aaf161d0'

select dbo.MD5('abcdefghijklmnopqrstuvwxyz') as 'MD5(''abcdefghijklmnopqrstuvwxyz'')'
union
select 'c3fcd3d76192e4007dfb496cca67e13b'

select dbo.MD5('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') as 'MD5(''ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'')'
union
select 'd174ab98d277d9f5a5611c2c9f419d9f'

select dbo.MD5('12345678901234567890123456789012345678901234567890123456789012345678901234567890') as 'MD5(''12345678901234567890123456789012345678901234567890123456789012345678901234567890'')'
union
select '57edf4a22be3c955ac49da2e2107b67a'

select dbo.MD5('ÎÒ') as 'MD5(''ÎÒ'')'
union
select 'a31d0f25367ebe046897f8a939ca4a9f'

Ïà¹ØÎÄÕÂ