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 ),  @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  


转载于:https://www.cnblogs.com/iyond/archive/2006/05/15/400388.html

你可能感兴趣的:(MD5算法的T-SQL实现)