Hashids独特的空间

时间:2016-01-06 22:27:40

标签: java hashids

我想知道我是否遇到了一个错误,或者只是遇到了Hashids算法的限制。

我正在使用自定义字母表,其中包含全部大写字母,减去“O”和“I”以及数字2 - 9.

在产生数百万个哈希后,我注意到重复出现了。我对此感到困惑,特别是因为Hashids声称重复是不可能的,因为算法只是整数的十六进制版本。只要整数保持唯一(例如永远计数),哈希也是如此。

自定义字母表是否更有可能出现重复项?另外,我期待我的字母表中唯一哈希的数量为:32 ^ 7 = 34,359,738,368。在我的计数器达到此数字之前,生成的哈希值从7个字符长到8个。

有没有人对为什么会这样做有任何想法?

编辑:另一个相当奇怪的异常:在生成10647个哈希值之后,剩下的(290万个以上)要么以K还是X开头。我开始认为自定义字母加上盐的长度会影响字母的方式洗牌。

2 个答案:

答案 0 :(得分:1)

有同样的问题,试试这个:

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

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

通过逐个删除最后5个字符来更改salt,只显示相同的结果。

使盐不超过20个字符似乎解决了这个问题。

答案 1 :(得分:0)

我通过将字母和数字I,O,0,1添加回正在使用的字母表中解决了这个问题。随着字母长度的增加,Hashids计算的旋转受到影响。我只是使用正则表达式过滤掉包含I,O,0或1的任何输出。