2010-03-26 79 views
3

有沒有一種方法可以從例如1到40000取一個數字並生成8個字符的散列?PHP - 從一個整數生成一個8字符的散列

我正在考慮使用base_convert,但無法找到強制它成爲8字符散列的方法。

任何幫助,將不勝感激!

回答

20

爲什麼不運行md5並取前8個字符?

因爲你想要一個散列,所以丟棄部分並不重要,而是相同的輸入會產生相同的散列。

$hash = substr(md5($num), 0, 8); 
+3

感謝誰固定的。我一定睡着了。 – 2010-03-26 02:25:28

+3

我的號碼範圍內是否有碰撞的機會? – doc 2010-03-26 02:31:58

+0

更好的直覺告訴我不......但你可能想要進行測試。由於40,000不是一個龐大的數字,你可以很容易地測試。 – 2010-03-26 02:44:30

0

的方法有很多...

一個例子

$x = ? 
$s = ''; 
for ($i=0;$i<8;++$i) 
{ 
    $s .= chr($x%26 + ord('a')); 
    $x /= 26; 
} 
+0

是不是隻是有效地改變數字的基礎? – nickf 2010-03-26 02:25:11

+0

當然。但請求非常模糊 - 它只是要求一個8char散列。 – SteelBytes 2010-03-26 02:26:24

+0

對不起,我隱約地問了一個問題:(我試圖從任何整數生成一個8字符的散列,但不只是想用剩下的長度來填充散列,有什麼想法嗎? – doc 2010-03-26 02:34:44

0
$hash = substr(hash("sha256",$num), 0, 8); 
+0

這是怎麼回事?我的'md5'非常強大,爲什麼'sha256'? – 2010-03-26 02:28:44

+0

@GeorgeEdison:md5非常弱,需要幾個小時才能產生衝突。 – neo 2010-03-26 16:02:34

4
>>> math.exp(math.log(40000)/8) 
3.7606030930863934 

因此,你需要4位數的符號從40000產生8個字符的哈希值:

sprintf("%08s", base_convert($n, 10, 4)) 
0

那麼你想要將一個6位數的數字轉換爲8位數的字符串嗎?

sprintf("%08d", $number); 

當然哈希是不可逆的 - 但沒有鹽/ IV它可能有點容易入侵。一個更好的解決方案可能是:

substr(sha1($number . $some_secret),0,8); 

C.

相關問題