Существует ли идеальная хэш-функция для комбинированных входных наборов номеров 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. У чего-нибудь меньшего будут столкновения, но они, вероятно, довольно редки.

Другие вопросы по тегам