有沒有一種方法可以從例如1到40000取一個數字並生成8個字符的散列?PHP - 從一個整數生成一個8字符的散列
我正在考慮使用base_convert
,但無法找到強制它成爲8字符散列的方法。
任何幫助,將不勝感激!
有沒有一種方法可以從例如1到40000取一個數字並生成8個字符的散列?PHP - 從一個整數生成一個8字符的散列
我正在考慮使用base_convert
,但無法找到強制它成爲8字符散列的方法。
任何幫助,將不勝感激!
爲什麼不運行md5
並取前8個字符?
因爲你想要一個散列,所以丟棄部分並不重要,而是相同的輸入會產生相同的散列。
$hash = substr(md5($num), 0, 8);
的方法有很多...
一個例子
$x = ?
$s = '';
for ($i=0;$i<8;++$i)
{
$s .= chr($x%26 + ord('a'));
$x /= 26;
}
是不是隻是有效地改變數字的基礎? – nickf 2010-03-26 02:25:11
當然。但請求非常模糊 - 它只是要求一個8char散列。 – SteelBytes 2010-03-26 02:26:24
對不起,我隱約地問了一個問題:(我試圖從任何整數生成一個8字符的散列,但不只是想用剩下的長度來填充散列,有什麼想法嗎? – doc 2010-03-26 02:34:44
$hash = substr(hash("sha256",$num), 0, 8);
這是怎麼回事?我的'md5'非常強大,爲什麼'sha256'? – 2010-03-26 02:28:44
@GeorgeEdison:md5非常弱,需要幾個小時才能產生衝突。 – neo 2010-03-26 16:02:34
>>> math.exp(math.log(40000)/8)
3.7606030930863934
因此,你需要4位數的符號從40000產生8個字符的哈希值:
sprintf("%08s", base_convert($n, 10, 4))
那麼你想要將一個6位數的數字轉換爲8位數的字符串嗎?
sprintf("%08d", $number);
當然哈希是不可逆的 - 但沒有鹽/ IV它可能有點容易入侵。一個更好的解決方案可能是:
substr(sha1($number . $some_secret),0,8);
C.
爲PHP:
$seed = 'JvKnrQWPsThuJteNQAuH';
$hash = sha1(uniqid($seed . mt_rand(), true));
# To get a shorter version of the hash, just use substr
$hash = substr($hash, 0, 10);
感謝誰固定的。我一定睡着了。 – 2010-03-26 02:25:28
我的號碼範圍內是否有碰撞的機會? – doc 2010-03-26 02:31:58
更好的直覺告訴我不......但你可能想要進行測試。由於40,000不是一個龐大的數字,你可以很容易地測試。 – 2010-03-26 02:44:30