--
测试
select dbo.MD5( ' 我 ' ) as ' MD5( '' 我 '' ) '
union
select ' a31d0f25367ebe046897f8a939ca4a9f '
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
* 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