MD5算法的T-SQL实现

--测试
select dbo.MD5(''as 'MD5('''')' 
union 
select 'a31d0f25367ebe046897f8a939ca4a9f'

/***************************************************************************** 
* 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), @S110xD76AA478
    
SELECT @d = dbo.MD5_FF(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S120xE8C7B756
    
SELECT @c = dbo.MD5_FF(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S130x242070DB
    
SELECT @b = dbo.MD5_FF(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S140xC1BDCEEE
    
SELECT @a = dbo.MD5_FF(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S110xF57C0FAF
    
SELECT @d = dbo.MD5_FF(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S120x4787C62A
    
SELECT @c = dbo.MD5_FF(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S130xA8304613
    
SELECT @b = dbo.MD5_FF(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S140xFD469501
    
SELECT @a = dbo.MD5_FF(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S110x698098D8
    
SELECT @d = dbo.MD5_FF(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S120x8B44F7AF
    
SELECT @c = dbo.MD5_FF(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S130xFFFF5BB1
    
SELECT @b = dbo.MD5_FF(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S140x895CD7BE
    
SELECT @a = dbo.MD5_FF(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S110x6B901122
    
SELECT @d = dbo.MD5_FF(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S120xFD987193
    
SELECT @c = dbo.MD5_FF(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S130xA679438E
    
SELECT @b = dbo.MD5_FF(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S140x49B40821

    
SELECT @a = dbo.MD5_GG(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S210xF61E2562
    
SELECT @d = dbo.MD5_GG(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S220xC040B340
    
SELECT @c = dbo.MD5_GG(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S230x265E5A51
    
SELECT @b = dbo.MD5_GG(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S240xE9B6C7AA
    
SELECT @a = dbo.MD5_GG(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S210xD62F105D
    
SELECT @d = dbo.MD5_GG(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S220x2441453
    
SELECT @c = dbo.MD5_GG(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S230xD8A1E681
    
SELECT @b = dbo.MD5_GG(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S240xE7D3FBC8
    
SELECT @a = dbo.MD5_GG(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S210x21E1CDE6
    
SELECT @d = dbo.MD5_GG(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S220xC33707D6
    
SELECT @c = dbo.MD5_GG(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S230xF4D50D87
    
SELECT @b = dbo.MD5_GG(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S240x455A14ED
    
SELECT @a = dbo.MD5_GG(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S210xA9E3E905
    
SELECT @d = dbo.MD5_GG(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S220xFCEFA3F8
    
SELECT @c = dbo.MD5_GG(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S230x676F02D9
    
SELECT @b = dbo.MD5_GG(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S240x8D2A4C8A

    
SELECT @a = dbo.MD5_HH(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S310xFFFA3942
    
SELECT @d = dbo.MD5_HH(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S320x8771F681
    
SELECT @c = dbo.MD5_HH(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S330x6D9D6122
    
SELECT @b = dbo.MD5_HH(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S340xFDE5380C
    
SELECT @a = dbo.MD5_HH(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S310xA4BEEA44
    
SELECT @d = dbo.MD5_HH(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S320x4BDECFA9
    
SELECT @c = dbo.MD5_HH(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S330xF6BB4B60
    
SELECT @b = dbo.MD5_HH(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S340xBEBFBC70
    
SELECT @a = dbo.MD5_HH(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S310x289B7EC6
    
SELECT @d = dbo.MD5_HH(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S320xEAA127FA
    
SELECT @c = dbo.MD5_HH(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S330xD4EF3085
    
SELECT @b = dbo.MD5_HH(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S340x4881D05
    
SELECT @a = dbo.MD5_HH(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S310xD9D4D039
    
SELECT @d = dbo.MD5_HH(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S320xE6DB99E5
    
SELECT @c = dbo.MD5_HH(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S330x1FA27CF8
    
SELECT @b = dbo.MD5_HH(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S340xC4AC5665

    
SELECT @a = dbo.MD5_II(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 0), @S410xF4292244
    
SELECT @d = dbo.MD5_II(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 7), @S420x432AFF97
    
SELECT @c = dbo.MD5_II(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 14), @S430xAB9423A7
    
SELECT @b = dbo.MD5_II(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 5), @S440xFC93A039
    
SELECT @a = dbo.MD5_II(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 12), @S410x655B59C3
    
SELECT @d = dbo.MD5_II(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 3), @S420x8F0CCC92
    
SELECT @c = dbo.MD5_II(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 10), @S430xFFEFF47D
    
SELECT @b = dbo.MD5_II(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 1), @S440x85845DD1
    
SELECT @a = dbo.MD5_II(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 8), @S410x6FA87E4F
    
SELECT @d = dbo.MD5_II(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 15), @S420xFE2CE6E0
    
SELECT @c = dbo.MD5_II(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 6), @S430xA3014314
    
SELECT @b = dbo.MD5_II(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 13), @S440x4E0811A1
    
SELECT @a = dbo.MD5_II(@a@b@c@d, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 4), @S410xF7537E82
    
SELECT @d = dbo.MD5_II(@d@a@b@c, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 11), @S420xBD3AF235
    
SELECT @c = dbo.MD5_II(@c@d@a@b, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 2), @S430x2AD7D2BB
    
SELECT @b = dbo.MD5_II(@b@c@d@a, (SELECT [Word] FROM @tTmp WHERE [ID] = @iWordArrayCount + 9), @S440xEB86D391

    
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 


posted @ 2006-05-15 11:28  伊飏  阅读(1343)  评论(0编辑  收藏  举报