函数代码:
/*
****************************************************************************
* 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
使用方法:
select dbo.MD5('admin') as adminField