Мне нужно выбрать функцию хеширования для преобразования уникального 8-байтового идентификатора в 4-байтовый идентификатор (как можно более уникальный) на 12-битном микроконтроллере (MSP430) на C.
Какую функцию хеширования вы бы посоветовали?
Я нашел несколько функций здесь, но не знаю, какую из них выбрать.
Обновлять: вот старый аналогичный вопрос, определяющий исходный уникальный формат идентификатора: Хеширование 64-битного значения в 32-битный MAC-адрес
Обновление 2:
RSHash((const uint8_t*)ID_8BYTE, 8);
uint32_t RSHash(const uint8_t* key, unsigned int len)
{
uint32_t b = 378551;
uint32_t a = 63689;
uint32_t hash = 0;
uint32_t i = 0;
for(i = 0; i < len; key++, i++)
{
hash = hash * a + (*key);
a = a * b;
}
return hash;
}
Хм, интересно, может ли это быть лучше в другом месте (Криптография? Перекрестная проверка?), Поскольку я думаю, что ответ зависит от того, насколько хорошо распределены 8-байтовые хэши. Если они взяты из хорошего алгоритма хеширования, то, я думаю, будет работать любой алгоритм хеширования, но если есть предубеждения, вам может потребоваться особая обработка.
Как писал Кен Й-Н, нам нужно больше узнать о 8-байтовом идентификаторе. Вопрос помечен как "uuid", может быть, это случайное число? В этом случае все биты случайны или только некоторые? Или это что-то еще, например порядковый номер? Если взять, скажем, 4 старших байта, то это будет хорошо, если все биты случайны, но очень плохо, если это порядковый номер!
В зависимости от свойств 8-байтового IS LFSR может дать полезные результаты.
Хм, без дополнительного контекста (как сконструирован исходный 8-байтовый идентификатор), это либо запрашивает ответы только на мнение, либо слишком широкое ... Так что просто мое мнение (следовательно, не ответ), но CRC32 может быть использован (хорошая реализация уже существует на Сайт Ламмерта Биса). Но нет реальной причины отдавать предпочтение тому, что связано с общей функцией хеширования, которую вы связали ...
Он еще не хеширован, поэтому отсекать 4 байта нецелесообразно. Вот старый аналогичный вопрос с указанием исходного уникального формата идентификатора: stackoverflow.com/questions/20082130/…
А что насчет CRC-32?
Думаю, здесь вы просите волшебства.
у вас уже есть 8-байтовый идентификатор, тогда байты довольно случайны, просто отрезайте любые 4 байта, я думаю