2011-08-14 38 views
1

我需要一個可以在不到26個字符 的Md5產生32個字符長的字符串表示的哈希值,如果將其轉換爲base 36有多好會是哪一個使用,MD5散列或CRC32在這種情況下

我需要散列不是用於密碼學,而是用於唯一性,基本上根據輸入和輸入數據的時間來識別每個輸入。目前我可以認爲這是

 $hash=md5(str_ireplace(".","",microtime()).md5($input_data)) ; 
     $unique_id= base_convert($hash,16,36) ; 

應該這樣或使用crc32這將給較小的散列大小,但我害怕它不會是獨特的?

+1

出於好奇:爲什麼您的唯一ID限制爲26個字符? –

+1

在md5碰撞之前,您可能會遇到crc323碰撞。但是,我會至少使用sha1來獲得唯一性。 – mbx

+0

使用sha-1散列是完全可以接受的,然後截斷所需數量的字符。除非你處理數十億個物品,否則26個角色應該不會造成碰撞。 –

回答

1

我認爲一個更簡單的解決方案可以發生。

根據你的說法,你有26個字符的空間。然而,爲了澄清我所理解的性格以及你所理解的性格,我們來做一些挖掘。

MD5哈希acc。到維基百科產生16字節散列。

CRC32算法生成4字節散列。

我明白「字符」(最簡單的意思)是ASCII字符。每個ASCII字符(例如A = 65)都是8位長。

MD5 aglorithm產生的每個字節有16個字節* 8位= 128位,CRC32是32位。

你必須明白散列不是數學上唯一的,而是「可能是唯一的」。

所以我的解決方案,給你的描述,然後將代表的散列位ascii字符。

如果您只有MD5和CRC32之間的選擇,答案將是MD5。但你也可以適合一個SHA-1 160位散列< 26個字符的字符串(它將是20個ASCII字符長)。

如果你關心每個散列使用的符號集合,這兩個散列都在集合[A-Za-z0-9]中(我相信)。最後,當你將基本上從一個基數到另一個基數的數字轉換爲數字時,這個數字不會改變,因此算法的強度不會改變;但是,這個數字並不會改變。它只是改變了數字的表現方式。

+1

SHA1和MD5都輸出字節。顯示它們的常用方法是十六進制,但base64編碼它們會使表示更短。 –