2014-05-17 77 views
2

我需要在oracle中獲得MD5哈希值,對於這個我使用STANDARD_HASH函數,但是我的誤解不大。爲什麼STANDARD_HASH('expr','MD5')的結果總是大寫?

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

C47D187067C6CF953245F128B5FDE62A

字母字符是大寫字母。

但在其他的數據庫,例如在MySQL中,從結果:select md5('word')是:

c47d187067c6cf953245f128b5fde62a

完全一樣的結果(小寫)是由例如PHP的md5()功能。

問題:爲什麼要用大寫字母返回oracle的STANDARD_HASH('expr','MD5')字母字符?這裏不對勁?

+3

沒有對錯,只是一個供應商選擇了大寫字母,另一個供應商選擇了十六進制數字的小寫字母 – nos

+0

現在明白了,非常感謝。 – RIKI

+0

Oracle's finally創建了一個簡單的哈希函數,嗚呼!不幸的是,這意味着我將不得不重新編寫這個程序_again_ :-(。我不知道爲什麼他們每次都棄用這個功能...... – Ben

回答

3

對於十六進制編碼,沒有標準情況(大寫或小寫)。根據RFC 4648,編碼應該是大寫的。但是有其他的標準使用小寫字母。

散列函數被定義爲輸出字節,而不指定任何十六進制編碼。所以如果你想比較十六進制字符串而不是字節,在我看來,它是比較散列的首選方法,那麼你需要做一個不區分大小寫的比較。比較字節應該是首選。我個人比較喜歡大寫字母(因爲我認爲它比較容易閱讀(人們大部分閱讀字母的頂部),並且因爲至少有一個特定的標準,但其他人使用小寫字母,並且有一些參數,好吧,

至於爲什麼Oracle針對該特定功能返回大寫字母:這是一個只有甲骨文能夠回答的問題,恐怕是「因爲這就是它的定義」是我們唯一能夠想到的東西

相關問題