SQL Server内实现MD5的计算

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  

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  

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  

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  

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  

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  

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  

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  

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  

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  

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  

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  

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  

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  

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  

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  

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  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

/***************************************************************************** 
* Name: MD5 
* Description: MD5 
****************************************************************************
*/
 
CREATE   FUNCTION  dbo.MD5( 
     
@sOrigMess      NVARCHAR ( 4000

RETURNS   CHAR ( 32
  
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
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

/***************************************************************************** 
* Name: MD5_AddUnsigned 
* Description: MD5_AddUnsigned 
****************************************************************************
*/
 
CREATE   FUNCTION  dbo.MD5_AddUnsigned( 
     
@iX          INT  
    ,
@iY          INT  

RETURNS   INT  
  
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
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  OFF  
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 )
AS
BEGIN
  
IF   @sOrigMess   IS   NULL
    
SET   @sOrigMess   =   ''
  
  
DECLARE   @bOrigMess   VARBINARY ( 8000 )
  
SET   @bOrigMess   =   CONVERT ( VARBINARY @sOrigMess

  
DECLARE   @iLenOfMess        INT
  
DECLARE   @iWordArrayLen     INT
  
DECLARE   @iPosOfWord        INT
  
DECLARE   @iPosOfMess        INT
  
DECLARE   @iCountOfWord      INT  

  
SET   @iLenOfMess   =   DATALENGTH ( @bOrigMess )
  
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 ( @bOrigMess @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
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

/***************************************************************************** 
* Name: MD5_F 
* Description: MD5_F 
****************************************************************************
*/
 
CREATE   FUNCTION  dbo.MD5_F( 
     
@x          INT  
    ,
@y          INT  
    ,
@z          INT  

RETURNS   INT  
  
AS  
BEGIN  
    
RETURN (( @x   &   @y |  (( ~ @x &   @z )) 
END  

GO
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
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  
  
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
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

/***************************************************************************** 
* Name: MD5_G 
* Description: MD5_G 
****************************************************************************
*/
 
CREATE   FUNCTION  dbo.MD5_G( 
     
@x          INT  
    ,
@y          INT  
    ,
@z          INT  

RETURNS   INT  
  
AS  
BEGIN  
    
RETURN (( @x   &   @z |  ( @y   &  ( ~ @z ))) 
END  

GO
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
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  
  
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
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

/***************************************************************************** 
* Name: MD5_H 
* Description: MD5_H 
****************************************************************************
*/
 
CREATE   FUNCTION  dbo.MD5_H( 
     
@x          INT  
    ,
@y          INT  
    ,
@z          INT  

RETURNS   INT  
  
AS  
BEGIN  
    
RETURN ( @x   ^   @y   ^   @z
END  

GO
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
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  
  
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
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

/***************************************************************************** 
* Name: MD5_I 
* Description: MD5_I 
****************************************************************************
*/
 
CREATE   FUNCTION  dbo.MD5_I( 
     
@x          INT  
    ,
@y          INT  
    ,
@z          INT  

RETURNS   INT  
  
AS  
BEGIN  
    
RETURN ( @y   ^  ( @x   |  ( ~ @z ))) 
END  

GO
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
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  
  
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
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

/***************************************************************************** 
* Name: MD5_LShift 
* Description: MD5_LShift 
****************************************************************************
*/
 
CREATE   FUNCTION  dbo.MD5_LShift( 
     
@iValue          INT  
    ,
@iShiftBits      TINYINT  

RETURNS   INT  
  
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
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

/***************************************************************************** 
* Name: MD5_RShift 
* Description: MD5_RShift 
****************************************************************************
*/
 
CREATE   FUNCTION  dbo.MD5_RShift( 
     
@iValue          INT  
    ,
@iShiftBits      TINYINT  

RETURNS   INT  
  
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
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

/***************************************************************************** 
* Name: MD5_RotateLeft 
* Description: MD5_RotateLeft 
****************************************************************************
*/
 
CREATE   FUNCTION  dbo.MD5_RotateLeft( 
     
@iValue          INT  
    ,
@iShiftBits      TINYINT  

RETURNS   INT  
  
AS  
BEGIN  
    
RETURN (dbo.MD5_LShift( @iValue @iShiftBits |  dbo.MD5_RShift( @iValue , ( 32   -   @iShiftBits ))) 
END  

GO
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

/***************************************************************************** 
* Name: MD5_WordToHex 
* Description: MD5_WordToHex 
****************************************************************************
*/
 
CREATE   FUNCTION  dbo.MD5_WordToHex( 
     
@iValue          INT  

RETURNS   CHAR ( 8
  
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
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

/***************************************************************************** 
* Name: MD5_m_2Power 
* Description: 常数组 
****************************************************************************
*/
 
CREATE   FUNCTION  dbo.MD5_m_2Power( 
    
@i      TINYINT  

RETURNS   INT  
  
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
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

/***************************************************************************** 
* Name: MD5_m_OnBits 
* Description: 常数组 
****************************************************************************
*/
 
CREATE   FUNCTION  dbo.MD5_m_OnBits( 
  
@i    TINYINT  

RETURNS   INT  
  
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
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO  

 
 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值