2011-08-30 135 views
1

我想生成唯一的64位密鑰(僞) - 隨機地標識我們模型中的對象。在系統的所有用戶中,我需要儘可能保持唯一的密鑰(將任何N個密鑰一起使用時的衝突概率降至最低)。如何生成唯一的64位密鑰

因爲我們的數據便宜,所以現在通常的GUID已經不存在了。因爲我不認爲需要在同一個環境中使用超過100萬個密鑰,所以我認爲64位就足夠了(碰撞概率約爲10e-7)。作爲一個側面說明,我還需要一個方案來將這些密鑰的元組摺疊/散列成一個單一的64位密鑰,該密鑰也需要分佈/獨特。

因爲無論如何我需要一個很好的(分佈良好的)散列函數,所以將一個GUID摺疊成一半(也許會以某種方式佔用GUID中的固定位)可以嗎?還是使用本地RNG更好?我將如何播種RNG以最大限度地提高跨代空間/時間的獨特性? 我需要一個RNG嗎?

我並不是特別期待效率(達到某一點),但我真的很希望確保這些概率符合他們的承諾!

回答

2

使用像md5這樣的快速128位加密散列來散列計數器,然後將其分成兩部分。這會給你「隨機」,獨立的值,每個64位,它應該是非常有效的。

你確定你不能使用簡單的計數器嗎?

更新如果您需要分佈式解決方案,只需在每臺計算機上放置一個計數器並散列機器的MAC地址加上計數器即可。爲了獲得更好的吞吐量,每臺計算機使用多個計數器,每個計數器具有不同的名稱(A,B等),並對該名稱進行哈希。這是使用哈希的最大優勢 - 你可以在裏面扔東西。注意不要含糊不清(例如,在每次散列之間加上「 - 」,這樣名字「1」加上「23」的計數不會與名稱「12」混淆,並且計數「3」)。

+0

我們目前有一個分佈32位密鑰範圍的服務器來保證唯一性,但使用這種簡單的計數器正是我試圖避免的(單點故障,連接問題)。 – fparadis2

+0

您可以使用以前的ID代替計數器。這樣你可以有很多獨立的「計數器」,因爲每個MD5都給你兩個。 – Rotsor

+0

或有不同來源的前綴。一旦你使用哈希值,選擇是無止境的。例如,每臺機器都可以散列它的MAC地址加一個計數器等,等等更新了答案。 –