2012-08-29 89 views
5

我有MSSQL的这个片段 -MySQL的等价MSSQL CONVERT()的

CONVERT(INT, HASHBYTES('MD5', {some_field})) 

...我真的很喜欢MySQL的当量。我很确定HASHBYTES('MD5', ...)位与MySQL的MD5(...)相同 - 这是CONVERT(INT, ...)位,这让我很困惑。

谢谢。

回答

6

从已MD5()功能MySQL手册条目:

的值作为返回的32位十六进制数字,或NULL字符串如果变量值是NULL

您上面引述

的MSSQL CONVERT()功能通过截断为4最低阶字节其varbinary参数转换为有符号的32位整数。这有点麻烦,因为MySQL算法可以达到64位精度。

因此,我们必须采取的最右边的8位数字MySQL的十六进制表示(表示4最低阶字节)的和转换为使用MySQL的CONV()功能到十进制,然后符号扩展的结果:

CONV(RIGHT(MD5('foo'),8), 16, 10)^0x80000000 - 0x80000000 
+0

不幸的是,该都似乎导致零,这不是什么MSSQL产生。 – Jez

+0

@Jez:见上面我更新的答案。实际情况是,你可能不应该这样做,特别是在安全应用程序中,因为在转换过程中丢失了75%的散列值。 – eggyal

+0

是的,看起来你是对的。多么不幸... – Jez