2

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

我正在使用自定义字母表,它由所有大写字母组成,减去“O”和“I”以及数字 2 - 9。

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

自定义字母表是否更容易出现重复?此外,我预计我的字母表的唯一哈希数为:32^7 = 34,359,738,368。在我的计数器达到这个数字之前,生成的 hashids 从 7 个字符长增加到 8 个。

有没有人知道为什么会这样?

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

4

2 回答 2

1

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

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

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

通过一个一个删除最后5个字符来改变盐,只是显示相同的结果。

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

于 2016-04-04T04:19:02.500 回答
0

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

于 2016-04-13T18:44:18.577 回答