怎么在存储过程使用md5加密技术。或者是sqlserver的自定义md5加密函数

解决方案 »

  1.   

    /***************************************************************************** 
    * 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
      

  2.   


    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
      

  3.   


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

  4.   


    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
      

  5.   


    /*****************************************************************************
    * 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)
      

  6.   


      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')