Существует ли идеальная хеш-функция для комбинированных входных наборов номеров IMEI и MAC-адресов? (C реализация) - PullRequest
1 голос
/ 16 августа 2011

Я ищу хэш-функцию, которую я могу использовать для предоставления единообразных уникальных идентификаторов устройствам, которые подключаются к нашей сети либо с помощью модема 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 Ответ

3 голосов
/ 16 августа 2011

Невозможно создать идеальный хэш для неизвестного растущего набора входных данных.Вы можете просто сделать поле на один бит больше, чем какой бы ни был IMEI или MAC, и использовать этот бит, чтобы указать, какой это тип идентификатора, вместе со всем IMEI / MAC.Все, что меньше , будет иметь столкновения, но они, вероятно, довольно редки.

...