CSDN博客

img jinxg

MD5算法的T-SQL实现(FOR SQL2000)

发表于2004/10/9 10:16:00  496人阅读

分类: SQLServer

程序代码:
/***************************************************************************** 
* 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 0

相关文章推荐

img
取 消
img