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

 
 
發佈了33 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章