2016-01-06 19 views
0

我想知道我是否遇到了一個bug,或者剛剛遇到了Hashids算法的限制。Hashids獨特的空間

我使用一個自定義的字母,其中包括所有大寫字母的,減去「O」和「I」與數字2 - 9

產生幾百萬散列後,我注意到,副本開始出現。我很困惑,尤其是因爲Hashids聲稱重複是不可能的,因爲算法只是一個整數的十六進制版本。只要整數仍然是唯一的(例如永遠數數),哈希值也是如此。

自定義字母表是否使重複出現的可能性更大?另外,我期待着我的字母表中唯一的哈希數是:32^7 = 34359,738,368。在我的櫃檯達到這個數字之前,生成的hashids從7個字符長到8個。

有沒有人有任何想法,爲什麼會發生這種情況?

編輯:另一個相當奇怪的異常:在生成10647個散列之後,剩下的(290萬加)或者以K或X開始。我開始認爲自定義字母加上鹽的長度會影響字母被洗牌。

+0

您使用哪種語言? – Paulpro

+0

@Paulpro,對不起,Java。我也將它作爲標籤添加了。此外,使用Hashids版本1.0.0 – dmux

+0

*「生成幾百萬次哈希後」* - 您試圖準確生成多少? –

回答

0

我解決了這個問題,將字母和數字I,O,0,1加回到使用的字母表中。隨着字母表長度的增加,由Hashids計算的旋轉受到影響。我只是用正則表達式過濾掉了包含I,O,0或1的任何輸出。

1

有同樣的問題,只是試試這個:

var hashids = new Hashids("BSomeoneNameN161179IBRB46", 5, "ABCDEFGHIJKLMNPQRSTUVWXYZ1234567890"); 

var id = hashids.encode(1234567); 
var numbers = hashids.decode(id); 

刪除最後5個字符逐一改變鹽,只是顯示同樣的結果。

使鹽不超過20個字符似乎解決了這個問題。