所以我无法弄清楚如何在C ++中做到这一点。我需要对长度为96位的数据进行模运算和整数转换。
示例:
struct Hash96bit
{
char x[12];
};
int main()
{
Hash96bit n;
// set n to something
int size = 23;
int result = n % size
}
编辑:我尝试使用96位哈希,因为我有3个浮点数,这些浮点数在组合时会创建一个唯一的组合。认为最好用作哈希,因为你根本不需要处理它。
编辑:好的......所以在这一点上我不妨解释更大的问题。我有一个3D世界,我想细分为扇区,这样一组对象可以放置在可以进行平截头体剔除的扇区中,而物理迭代则需要更少的时间。所以在乞讨时可以说你在0,0,0区。当然我们将它们全部存储在阵列中,很酷,但是当我们远离0,0,0时会发生什么?我们不再关心那些行业了。因此我们使用散列映射,因为内存不是问题,因为我们将使用扇区值而不是句柄来访问数据。现在一个扇区是3个浮点数,可以使用任意数量的算法轻松完成散列。我认为如果我可以说3个浮点数是关键并且从那里开始可能会更好,我只需要一种方法来修改96位数以使其适合数据段。无论如何,我认为我只是要采用每个浮点数的底部位并使用64位散列,除非有人想出一些精彩的东西。感谢您的建议到目前为止。
答案 0 :(得分:1)
您可以使用jenkins哈希。
uint32_t jenkins_one_at_a_time_hash(char *key, size_t len)
{
uint32_t hash, i;
for(hash = i = 0; i < len; ++i)
{
hash += key[i];
hash += (hash << 10);
hash ^= (hash >> 6);
}
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
return hash;
}
答案 1 :(得分:1)
更新:刚刚阅读了你对问题的第二次编辑,我建议你使用David的jenkin的方法(我支持了一段时间)...只需将它指向struct
的{{1}}中的最低字节三个float
s。
关于“无论如何我认为我只是要采用每个浮点数的底部位” - 再次,哈希表使用哈希函数的想法不仅仅是映射输入中的每个位(更少的直到它们的一些子集)到散列输出中的一点。你可以很容易地以这种方式结束大量的碰撞,特别是如果桶的数量不是素数的话。例如,如果从每个float
获取21位,并且当前桶的数量恰好是1024,那么在%1024之后,只有10位来自一个的浮点数将用于不考虑其他浮点数的值...哈希(a,b,c)==哈希(d,e,c)对于所有c(它实际上比这更糟糕 - 像5.5,2.75等的值将会只使用几个尾数....)。
既然你坚持这一点(虽然很可能不是你需要的东西,并且用起来不恰当):
struct Hash96bit
{
union {
float f[3];
char x[12];
uint32_t u[3];
};
Hash96bit(float a, float b, float c)
{
f[0] = a;
f[1] = b;
f[2] = c;
}
// the operator will support your "int result = n % size;" usage...
operator uint128_t() const
{
return u[0] * ((uint128_t)1 << 64) + // arbitrary ordering
u[1] + ((uint128_t)1 << 32) +
u[2];
}
};