我正在寻找一种哈希算法,当给定64位顺序值时,将统一地哈希到8位。
我不想只使用最不重要的字节作为哈希值。
答案 0 :(得分:4)
作为Oli Charlesworth解决方案的一般情况,您可以选择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等
答案 1 :(得分:2)
缺少任何进一步的信息或约束,一种可能性就是将所有8个字节按位对XOR进行逐位异或。对于统一输入,这将是统一的。
我的C#生锈了,但是伪代码:
byte hash = 0;
for (int i = 0; i < 8; i++) {
hash ^= (byte)(val >> (i*8));
}