Хашид уникальное пространство
Мне было интересно, если я сталкиваюсь с ошибкой или просто столкнулся с ограничением алгоритма Хашидса.
Я использую собственный алфавит, который состоит из всех заглавных букв, минус "O" и "I" и цифр 2 - 9.
После генерации нескольких миллионов хешей я заметил, что начали появляться дубликаты. Я смущен этим, тем более, что Хашидс утверждает, что дублирование невозможно, поскольку алгоритм является просто шестнадцатеричной версией целого числа. И пока целые числа остаются уникальными (например, считая до бесконечности), то же самое будет и с хешами.
Повышает ли пользовательский алфавит вероятность появления дубликатов? Кроме того, я ожидал, что число уникальных хэшей для моего алфавита составит: 32^7 = 34 359 738 368. До того, как мой счетчик достиг этого числа, сгенерированные хешиды выросли с 7 символов до 8.
У кого-нибудь есть идеи относительно того, почему это происходит?
Редактировать: еще одна довольно странная аномалия: после генерации 10647 хешей остальные (2,9 миллиона плюс) начинаются с буквы K или X. Я начинаю думать, что пользовательский алфавит плюс длина соли влияют на то, как буквы перетасовываются.
2 ответа
Я решил эту проблему, добавив буквы и цифры I,O,0,1 обратно в используемый алфавит. С увеличением длины алфавита повлияло вращение, рассчитанное хашидами. Я просто отфильтровал любой вывод, который включал I, O, 0 или 1, используя регулярное выражение.
Есть такая же проблема, просто попробуйте это:
var hashids = new Hashids("BSomeoneNameN161179IBRB46", 5, "ABCDEFGHIJKLMNPQRSTUVWXYZ1234567890");
var id = hashids.encode(1234567);
var numbers = hashids.decode(id);
изменение соли путем удаления последних 5 символов один за другим, просто показывая тот же результат.
приготовление соли не более 20 символов решает проблему.