Как хэшировать два 32-битных целых числа в одно 32-битное целое число без столкновения?

#hash

Вопрос:

Я ищу одностороннее хеширование для объединения двух 32-битных целых чисел в одно 32-битное целое число. Не уверен, что это возможно сделать без столкновения.

Правка: Я думаю, что мои целые числа, как правило, невелики. Один из них редко занимает более 14 бит, а другой редко занимает более 20 бит.

Правка 2: Спасибо за помощь в комментариях. Я думаю, что в таких случаях, как если бы комбинация двух целых чисел занимала более 32 бит, я могу сделать что-то по-другому, чтобы не хэшировать ее. С учетом этого, как я должен хэшировать свои целые числа?

Спасибо!

Комментарии:

1. Математически невозможно избежать столкновений по принципу «ячейки «. Существует 2^32 32-разрядных целых числа и 2^64 пары.

2. Или подумайте об этом так: рассмотрим пары формы (0,x) , в которых первое число равно 0. Таких пар уже столько же, сколько доступных хэш-значений, поэтому они будут использовать все пространство хэш-значений. Затем хэш пары (1,0) должен столкнуться с одним из них.

3. Можете ли вы рассказать нам больше о своей настройке? Если у вас есть фиксированная коллекция пар, которая не «слишком велика», вы можете найти идеальную хэш-функцию специально для этих пар. Но если вы пытаетесь хэшировать «общие пары», то, как говорит Нейт Элдридж, это невозможно сделать.

4. 14 20-это все еще больше, чем 32, если вы можете ограничить это еще немного и сделать это гарантией, тогда это то, с чем мы можем работать