2011-01-28 50 views
7

我需要一個哈希算法,輸出最長20個字符的字母數字字符串。對於「字母數字」,我的意思是[a-zA-Z0-9]哈希算法,最多20個字符的字母數字輸出

輸入是UUID S IN規範形式(例如550e8400-e29b-41d4-a716-446655440000

在可替代的是有辦法到SHA1或MD5哈希轉換爲與這些限制的字符串?

謝謝。

編輯

不需要被加密安全。碰撞使數據不準確,但如果它們偶爾發生,我可以忍受它。

EDIT 2

我不知道,如果截斷MD5或SHA-1會使衝突經常發生。現在我想知道是否最好截取20個字符的MD5值或SHA1值。

+0

你有這些散列的任何所需的屬性?它們應該是加密安全的,還是足夠用於散列表? – templatetypedef 2011-01-28 09:02:00

+1

難道你不能在十六進制(或base64)中輸出SHA1或MD5哈希字符串,如果需要的話可以截斷爲20個字符? – 2011-01-28 09:03:35

回答

13

只需從GUID的哈希剪輯您不需要的字符即可。使用良好的散列函數,散列的任何部分的不可預測性都與該部分的大小成正比。如果你願意,你可以編碼它的基地32而不是標準的十六進制基地16.記住,這不會顯着改善每個字符的熵(只有25%)。

對於非加密用途,無論是截斷MD5,SHA1還是SHA2都無關緊要。熵也沒有明顯的缺陷。