(转贴)T-SQL MD5算法实现

    技术2022-05-11  57

    T-SQL MD5算法实现 /***************************************************************************** * 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), @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'

    最新回复(0)