☆☆☆网上流传的SQL MD5 算法对中文字符串不能产生正确的 MD5 码(修改方法)☆☆☆
版权所有,转载请注明.
xthmpro_cn@sohu.com.cn(May Flower Software)
网上流传的SQL MD5 算法经过检查,对中文字符串产生的 MD5 码,是不正确的。该算法的验证例子中的:
select dbo.MD5('我') as 'MD5(''我'')'
union
select 'a31d0f25367ebe046897f8a939ca4a9f'
但是,"我" 的正确的MD5码是:A92F38654F3A250602AF1E69A88699E3
经过检查是由于dbo.MD5_ConvertToWordArray函数对Unicode的处理有错误。改正后的函数如下:
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
/*****************************************************************************
* Name: MD5_ConvertToWordArray
* Description: MD5_ConvertToWordArray
*****************************************************************************/
ALTER FUNCTION dbo.MD5_ConvertToWordArray(
@sOrigMess VARCHAR(8000) = ''
)
RETURNS @tWordArray TABLE([ID] INT IDENTITY(0,1),[Word] INT)
AS
BEGIN
IF @sOrigMess IS NULL
SET @sOrigMess = ''
DECLARE @bOrigMess VARBINARY(8000)
SET @bOrigMess = CONVERT(VARBINARY, @sOrigMess)
DECLARE @iLenOfMess INT
DECLARE @iWordArrayLen INT
DECLARE @iPosOfWord INT
DECLARE @iPosOfMess INT
DECLARE @iCountOfWord INT
SET @iLenOfMess = DATALENGTH(@bOrigMess)
SET @iWordArrayLen = ((@iLenOfMess + 8)/64 + 1) * 16
SET @iCountOfWord = 0
WHILE(@iCountOfWord<@iWordArrayLen)
BEGIN
INSERT INTO @tWordArray([Word]) VALUES(0)
SET @iCountOfWord = @iCountOfWord + 1
END
SELECT @iPosOfMess = 0, @iPosOfWord = 0, @iCountOfWord = 0
WHILE(@iPosOfMess < @iLenOfMess)
BEGIN
SELECT @iCountOfWord = @iPosOfMess / 4, @iPosOfWord = @iPosOfMess % 4
UPDATE @tWordArray
SET [Word] = [Word] | dbo.MD5_LShift(UNICODE(SUBSTRING(@bOrigMess, @iPosOfMess + 1, 1)),@iPosOfWord * 8)
WHERE [ID] = @iCountOfWord
SET @iPosOfMess = @iPosOfMess + 1
END
SELECT @iCountOfWord = @iPosOfMess / 4, @iPosOfWord = @iPosOfMess % 4
UPDATE @tWordArray
SET [Word] = [Word] | dbo.MD5_LShift(0x80,@iPosOfWord*8)
WHERE [ID] = @iCountOfWord
UPDATE @tWordArray
SET [Word] = [Word] | dbo.MD5_LShift(@iLenOfMess,3)
WHERE [ID] = @iWordArrayLen - 2
UPDATE @tWordArray
SET [Word] = [Word] | dbo.MD5_RShift(@iLenOfMess,29)
WHERE [ID] = @iWordArrayLen - 1
RETURN
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
问题点数:100、回复次数:30Top
1 楼sdhylj(青锋-SS)(献血有益健康(别人的))回复于 2006-12-21 11:24:40 得分 4
1Top
2 楼jacobsan(梅)回复于 2006-12-21 11:25:30 得分 4
markTop
3 楼xthmpro_cn([可人])回复于 2006-12-21 11:27:40 得分 0
原来的算法网上到处都是:
http://tech.httpcn.com/show.asp?id=2712Top
4 楼jackie168(http://soft.eastrise.net)回复于 2006-12-21 11:31:54 得分 4
3Top
5 楼CloneCenter(复制中心)回复于 2006-12-21 11:32:54 得分 4
好的,来接分了。Top
6 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2006-12-21 11:35:44 得分 4
原来这样也可以的~
接分~Top
7 楼ccrun(老妖)(www.ccrun.com)回复于 2006-12-21 11:45:23 得分 4
原来这样也可以的~
接分~Top
8 楼xiaoku(野蛮人(^v^))回复于 2006-12-21 11:52:18 得分 4
接分。。。Top
9 楼comerliang(天地良心)(性欲被自己倒分倒没了,以后再也不敢倒分了,想倒分的兄弟看看我的下场吧,男人没了性欲真不爽)回复于 2006-12-21 12:00:37 得分 4
接分Top
10 楼qingshanyang(青山羊)回复于 2006-12-21 12:39:08 得分 4
接分.Top
11 楼cadenza7()回复于 2006-12-21 12:42:05 得分 4
MarkTop
12 楼CoolSlob()回复于 2006-12-21 13:06:07 得分 4
? 原来这样也可以的~
接分~
Top
13 楼CoolSlob()回复于 2006-12-21 13:06:28 得分 0
版权所有,转载请注明.
xthmpro_cn@sohu.com.cn(May Flower Software)Top
14 楼wozhuchuanwei(一个组件编写者,就一定是一个更优秀的Delphi开发者)回复于 2006-12-21 13:43:19 得分 4
Mark
以后要用的时候好找。Top
15 楼Blakhawk(黑鹰)回复于 2006-12-21 19:33:50 得分 4
牛人.收藏一下.备用Top
16 楼mengmou()mengmou()回复于 2006-12-21 19:37:36 得分 4
markTop
17 楼marco08(天道酬勤)回复于 2006-12-21 20:41:11 得分 4
学习Top
18 楼zhang_yzy(六子儿)回复于 2006-12-22 10:12:45 得分 4
收藏,
Top
19 楼itmingong(nous+wisdom+courage)回复于 2006-12-22 10:15:20 得分 4
用SQL处理MD5,牛Top
20 楼caixia615(*^_^*)‵My ɡīr!.ˊ想念妳ˋ 。(*^_^*)回复于 2006-12-22 10:35:45 得分 4
up,markTop
21 楼belllab(菜鸟)回复于 2006-12-22 11:41:43 得分 4
好东西,顶!Top
22 楼hy98521(斯达克)回复于 2006-12-22 11:42:29 得分 4
markTop
23 楼hy98521(斯达克)回复于 2006-12-22 11:42:35 得分 0
markTop
24 楼hy98521(斯达克)回复于 2006-12-22 11:42:42 得分 0
markTop
25 楼dreamw(网卡)回复于 2006-12-22 13:46:41 得分 4
有这样的事??顶起Top
26 楼feixiangVB(別以爲我不在乎!)回复于 2006-12-22 13:58:22 得分 4
收藏~~~`Top
27 楼fish_yht(百行孝为先,万业勤为径。)回复于 2006-12-22 14:10:54 得分 4
学习+收藏Top
28 楼crazyflower(小狂花,学习中……)回复于 2006-12-22 15:20:36 得分 4
markTop
29 楼spark_li(晕忽忽(恶人谷:通讯连长))回复于 2006-12-22 16:41:46 得分 4
markTop
30 楼cuixiping(无心●愚公)回复于 2007-04-18 19:07:25 得分 0
markTop




