2012-05-16 34 views
1

我有由字母,數字和特殊字符(電子郵件地址)組成的唯一可變長度字符串列表。列表中的每個電子郵件地址都是唯一的。單向函數將可變長度字符串散列爲Groovy中的12位數字

我需要一個單向散列函數(我並不需要能夠從生成的號碼檢索原始值),將哈希與鹽字符串,並生成一個12位數字。

我要確保其唯一性,所以我會檢查先前生成的值列表來檢測碰撞,然後生成一個新的號碼,如果有衝突。可預測性不是問題。

理想我想這一功能,必須用Groovy,但Java也將被罰款。

+0

你正在尋找一個[完美hash(http://en.wikipedia.org/wiki/Perfect_hash),只要有輸入字符串長度超過可能的輸出串(10^12,你的情況較少,它總是存在)。但是,所得到的散列函數是特定於該特定數據集的;你不能在不同的數據集上使用它,並且仍然保證唯一性。 –

+0

我改變了生成的值不必保證是唯一的要求。我將通過檢查已創建值的列表來檢查生成值中的衝突。在我的請求中還有其他事情需要糾正嗎? – anataliocs

+0

或者我可以將原始輸入(電子郵件)的一部分追加到生成的ID以使其唯一嗎? – anataliocs

回答

6

我需要保證每個生成的編號是唯一的。

嗯,這顯然將是一個問題。有可能的輸入字符串比可能的輸出值多。特別是,每個可能的輸出值(12位數的字符串)都是可能的輸入值。因此,如果所有這些都獲得唯一的輸出值,則不可能有任何輸出值留在任何其他輸入值中。

當然你可以總是記錄你遇到的每個電子郵件地址(所以第一個與000000000000結束了,第二個得到000000000001等),但是這是一個存儲問題,而不是散列這樣。您無法從輸入的輸入,而無需後備存儲。

+0

輸出會出現衝突問題。 –

+0

@BhavikAmbani:確實如此 - 當有更多可能的輸入時,你*不能*生成唯一的數字。 –

+0

因此要求是錯誤的。 –