GalaxyPilot —— D.S


                  生命不熄,戰(zhàn)斗不止
          數(shù)據(jù)加載中……

          MD5 T-SQL版

          代碼中含有UNICODE字符,要調(diào)試得先把這些字符刪了

          /*****************************************************************************
          * Name: T-SQL MD5算法實(shí)現(xiàn)
          * 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: 常數(shù)組
          *****************************************************************************/
          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: 常數(shù)組
          *****************************************************************************/
          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'

          posted on 2006-02-24 11:50 舵手 閱讀(1077) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 清涧县| 化隆| 体育| 芮城县| 巴塘县| 宁夏| 双柏县| 昆明市| 龙口市| 鱼台县| 泸州市| 缙云县| 和林格尔县| 和平县| 郑州市| 邹平县| 酒泉市| 临沂市| 阜城县| 潜江市| 会昌县| 库车县| 闽清县| 璧山县| 大埔区| 枣强县| 响水县| 永州市| 纳雍县| 民勤县| 洪洞县| 静安区| 桦川县| 东平县| 鹤峰县| 额尔古纳市| 德州市| 杭锦后旗| 肇东市| 历史| 锦屏县|