哈希值独特 space
Hashids unique space
我想知道我是否遇到了错误,或者只是 运行 进入了 Hashids 算法的限制。
我使用的是自定义字母表,它由所有大写字母、减去 "O" 和 "I" 以及数字 2 - 9 组成。
生成几百万个哈希后,我注意到开始出现重复项。我对此感到困惑,特别是因为 Hashids 声称不可能重复,因为该算法只是整数的十六进制版本。只要整数保持唯一(例如永远向上计数),哈希值也将保持唯一。
自定义字母表是否更容易出现重复项?此外,我希望我的字母表的唯一哈希数为:32^7 = 34,359,738,368。在我的计数器达到这个数字之前,生成的 hashids 从 7 个字符长到 8 个字符。
有人知道为什么会这样吗?
编辑:另一个相当奇怪的异常现象:在生成 10647 个哈希后,其余的(290 万以上)要么以 K 或 X 开头。我开始认为自定义字母表加上盐的长度会影响如何字母被打乱。
有同样的问题,试试这个:
var hashids = new Hashids("BSomeoneNameN161179IBRB46", 5, "ABCDEFGHIJKLMNPQRSTUVWXYZ1234567890");
var id = hashids.encode(1234567);
var numbers = hashids.decode(id);
通过一一删除最后 5 个字符来更改 salt,只是显示相同的结果。
使盐不超过 20 个字符似乎可以解决问题。
我通过将字母和数字 I,O,0,1 添加回正在使用的字母表中解决了这个问题。随着字母表长度的增加,哈希德计算出的旋转受到了影响。我只是使用正则表达式过滤掉了所有包含 I、O、0 或 1 的输出。
我想知道我是否遇到了错误,或者只是 运行 进入了 Hashids 算法的限制。
我使用的是自定义字母表,它由所有大写字母、减去 "O" 和 "I" 以及数字 2 - 9 组成。
生成几百万个哈希后,我注意到开始出现重复项。我对此感到困惑,特别是因为 Hashids 声称不可能重复,因为该算法只是整数的十六进制版本。只要整数保持唯一(例如永远向上计数),哈希值也将保持唯一。
自定义字母表是否更容易出现重复项?此外,我希望我的字母表的唯一哈希数为:32^7 = 34,359,738,368。在我的计数器达到这个数字之前,生成的 hashids 从 7 个字符长到 8 个字符。
有人知道为什么会这样吗?
编辑:另一个相当奇怪的异常现象:在生成 10647 个哈希后,其余的(290 万以上)要么以 K 或 X 开头。我开始认为自定义字母表加上盐的长度会影响如何字母被打乱。
有同样的问题,试试这个:
var hashids = new Hashids("BSomeoneNameN161179IBRB46", 5, "ABCDEFGHIJKLMNPQRSTUVWXYZ1234567890");
var id = hashids.encode(1234567);
var numbers = hashids.decode(id);
通过一一删除最后 5 个字符来更改 salt,只是显示相同的结果。
使盐不超过 20 个字符似乎可以解决问题。
我通过将字母和数字 I,O,0,1 添加回正在使用的字母表中解决了这个问题。随着字母表长度的增加,哈希德计算出的旋转受到了影响。我只是使用正则表达式过滤掉了所有包含 I、O、0 或 1 的输出。