2

我需要MD5在 oracle 中获取哈希,为此我使用STANDARD_HASH函数,但我没有什么误解。

在 oracle 中:select STANDARD_HASH('word', 'MD5') from dual结果是:

C47D187067C6CF953245F128B5FDE62A

字母字符为大写。

但在其他数据库中,例如在 mysql 中,结果来自:select md5('word')是:

c47d187067c6cf953245f128b5fde62a

完全相同的结果(小写)来自例如 php 的md5()函数。

问题:为什么返回 oracle 的 STANDARD_HASH('expr', 'MD5') 大写字母字符?这里不对劲?

4

1 回答 1

4

十六进制编码没有标准化大小写(大写或小写)。根据RFC 4648,编码应该是大写的。但是还有其他使用小写字母的标准。

散列函数被定义为输出字节,没有指定任何十六进制编码。因此,如果您想比较十六进制字符串而不是字节,在我看来,这是比较哈希的首选方法,那么您需要进行不区分大小写的比较。然而,比较字节应该是首选。

我个人更喜欢大写(因为我认为它更容易阅读(人们主要阅读字母的顶部)并且因为它至少有一个特定的标准。但其他人使用小写,并且也有争论。

至于为什么 Oracle 会为该特定函数返回大写:恐怕这是一个只有 Oracle 才能回答的问题。“因为它是这样定义的”是我们唯一能想到的。

于 2014-05-18T16:37:25.303 回答