Хеш не будет работать, поскольку он может вызвать столкновения. Каждый значительный входной бит должен быть сопоставлен с выходным битом.
Для письма у вас есть 90 - 65 = 25 различных значений, поэтому вы можете использовать 5 бит для представления буквы.
3-значное число имеет 1000 различных значений, поэтому для этого вам нужны 10 бит.
Если вы объединяете эти биты, у вас есть уникальное отображение от входа к 15-битовому номеру.
Этот подход прост, но он может расточать некоторые бит. Если выход должен быть как можно короче, можно отобразить следующим образом:
output = (L - 'A')*1000 + N
где L
это значение буквы, 'A'
это значение буквы А, N
является 3-значное число. Затем вы можете использовать как несколько бит, сколько необходимо для представления полного диапазона output
, что составляет 25 * 1000 - 1 = 24999. Здесь снова 15 бит, поэтому простой подход не теряет места.
Если количество входных бит меньше, чем входных битов, необходима хэш-функция. Я бы настоятельно рекомендовал для отображения строк в двоичные данные, как и выше, и использовать простую функцию для отображения входа к выходу, по этой причине:
общего назначение хэш-функция не может различать входные биты, потому что он ничего не знает об их значении.
Для 256 выходных бит, после хеширования значений 5.7e38, вероятность столкновения составляет 75%. Источник: Birthday Attack.
5.7e38 кажется огромным, но ему соответствует только 129 бит (2^129 = 6.8e38). В этом случае это означает, что есть вероятность превышения 75%, что существует пара строк с (129/15 = 8,6) Элементы, которые сталкиваются.
С другой стороны, если использовать очень простую функцию отображения как:
- усечение вход на 256 битов (использовать первые 17 элементов 15 бит каждый)
- сделать 256 битное значение XOR всех 15-битных элементы
вы можете Гарантийный лист нет столкновений между любыми двумя строками с максимально 17 элементами.
Хеш-функции, которые оптимизированы для генерации уникальных идентификаторов, скорее всего работают лучше, чем хэш общего назначения по сравнению с этим, но я бы сомневался, что они могут гарантировать беспорядочное хэширование всех 256-битных значений.
Заключение: Если большая часть входных строк имеет менее 17 элементов, я бы предпочел бы это сделать хэш.
спасибо за ваш ответ. Я буду смотреть в этом направлении. –