/*****************************************************************************
* 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