Хэширование последовательного 64-битного числа равномерно в 8 бит? - PullRequest
3 голосов
/ 17 декабря 2011

Я ищу алгоритм хеширования, который при задании 64-битного последовательного значения будет хэшировать до 8 битов равномерно.

Я не хочу просто использовать младший байт в качестве хэшазначение.

Ответы [ 2 ]

4 голосов
/ 17 декабря 2011

В общем случае решения Оли Чарльзворта вы можете выбрать взаимное ограничение с 256 и предварительно умножить каждый байт из вашего ввода на это значение, а затем XOR все значения вместе. Вы по-прежнему получите равномерное распределение, но для последовательных входов вы получите непоследовательный вывод, например:

byte result = 0;
int q = 33149;
foreach (byte b in BitConverter.GetBytes(input)) result += (byte)(b * q);

За 1, 2, 3, 4, 5, 6, ... он даст вам 125, 250, 119, 244, 113, 238 и т. Д.

2 голосов
/ 17 декабря 2011

В отсутствие какой-либо дополнительной информации или ограничений одна возможность - просто поразрядно-XOR все 8 байтов вместе. Это будет равномерно для равномерного ввода.

Мой C # ржавый, но в псевдокоде:

byte hash = 0;
for (int i = 0; i < 8; i++) {
    hash ^= (byte)(val >> (i*8));
}
...