Я ищу хэш-функцию, которую я могу использовать для предоставления единообразных уникальных идентификаторов устройствам, которые подключаются к нашей сети либо с помощью модема GSM, либо через соединение Ethernet.
Так что для любого данного устройства у меня естьлибо номер IMEI , либо MAC-адрес с жестким кодом, который я могу использовать для генерации хэша.
Я исследовал хеш-функции в течение последних нескольких часов, читая о различных некриптографических и криптографических хешах, которые я мог бы использовать.Я фокусируюсь на низких коллизиях по производительности, так как хэш вычисляется не очень часто.
Мои лидеры - MD5, FNV-1a, MurmurHash2, Hsieh и DJB.
Независимо от того, чтоХэш, который я использую, должен быть реализован на C и использоваться на микроконтроллере с крошечным процессором.
Я знаю, что хитрость в выборе хорошей хэш-функции для ваших нужд заключается в том, чтобы знать, какой тип ввода вы используете.Я собираюсь кормить его.
Причина, по которой я задаю этот вопрос, заключается в том, что мне в голову пришла идея, что и IMEI, и MAC имеют конечные длины и диапазоны, поэтому, возможно, существует довольно простая хеш-функция, котораяможет охватывать полные наборы обоих и не иметь коллизий.(Таким образом, идеальная хеш-функция)
Номер IMEI имеет длину 15 десятичных цифр (12-13 байтов в шестнадцатеричном формате?), А MAC-адрес составляет 6 байтов.Обдумывая это, я не думаю, что у вас будут коллизии между двумя наборами входных чисел, но не стесняйтесь поправлять меня, если это не так.Если бы вы сделали, могли бы вы сделать что-нибудь, чтобы предотвратить это?Добавить семена в один из наборов?
Я на правильном пути?Возможно ли найти идеальную хеш-функцию для этих комбинированных наборов?
Спасибо!
Обновление
Спасибо за ответы и комментарии.В итоге я использовал функцию тождества;) в качестве своей хэш-функции, а затем также использовал маску, поскольку существует потенциальное перекрытие между наборами чисел.
IMEI, IMEISV и MAC будут помещаться в 6,5 байтов илименьше, поэтому я храню свои значения в 7 байтах, а затем выполняю побитовое ИЛИ для первого байта с маской, на основе которой поступает набор, чтобы убедиться, что они уникальны для всех наборов.