Существует ли идеальная хэш-функция для комбинированных входных наборов номеров IMEI и MAC-адресов? (C реализация)
Я ищу хэш-функцию, которую я могу использовать, чтобы назначать унифицированные уникальные идентификаторы устройствам, которые подключаются к нашей сети с помощью модема 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 байтах, а затем выполняю побитовое ИЛИ для первого байта с маской, основанной на том, из какого набора получено число, чтобы убедиться, что они уникальный во всех наборах.
1 ответ
Там нет никакого способа сделать идеальный хэш над неизвестным, растущим входным набором. Вы можете просто сделать поле на один бит больше, чем любой из IMEI или MAC, и использовать этот бит, чтобы указать, какой это тип идентификатора, вместе со всем IMEI/MAC. У чего-нибудь меньшего будут столкновения, но они, вероятно, довольно редки.