散列顺序64位数均匀分为8位?

时间:2011-12-17 16:31:13

标签: c# hash integer

我正在寻找一种哈希算法,当给定64位顺序值时,将统一地哈希到8位。

我不想只使用最不重要的字节作为哈希值。

2 个答案:

答案 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));
}