Я работаю с устройствами, которые получают очень маленькие пакеты данных. Устройство уникально идентифицировано с помощью 48-битного ключа. Когда устройство получает отдельный пакет, ему необходимо прочитать пакет и определить, был ли пакет предназначен для этого устройства. Звучит просто, но пакет имеет достаточно места только для 16-битного ключа.Хеширование 48-битного ключа в 16-битное значение
Протокол связи не может быть изменен. Я не могу использовать несколько пакетов или любые другие поля в пакете. В основном мне нужно сохранить этот 48-битный идентификатор в 16-битном поле. Очевидно, что будут столкновения с любым решением.
Я рассматривал возможность отправки младших 16 бит исходного ключа или его хэширования. Каков наилучший способ сделать это при минимизации столкновений?
PS: На самом деле это похоже на то, что первые три байта исходного ключа всегда одинаковы, поэтому эта проблема просто сводилась к перетаскиванию 24-битного ключа в 16-битный ключ, но все же неплохо.
PPS: Столкновения не являются катастрофическими. Устройство может восстанавливаться, но оно дорого.
«* Каков наилучший способ сделать это при минимизации столкновений?» «Это невозможно ответить, не зная о назначении и распределении используемых значений. – RBarryYoung
Если секретные ключи генерируются случайным образом, их хэширование не приведет к каким-либо меньшим коллизиям, чем захват 16-разрядного подраздела. Было бы лучше скрыть ключ, если это имеет значение. –
Являются ли отдельные устройства программируемыми? Можете ли вы настроить устройство, чтобы сообщить ему, что его 16-битный ключ? Если вы знаете все идентификаторы устройств спереди, вы можете создать [минимальный совершенный хеш] (http://en.wikipedia.org/wiki/Perfect_hash_function#Minimal_perfect_hash_function). Но, не указав устройству на поиск определенных номеров пакетов, вероятность столкновения будет отличной от нуля. –