如何散列一个96位结构体/数字
How to hash a 96-bit struct/number?
所以我不知道如何在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位的数字进行mod,使其适合数据段,可能会更好。不管怎样,我想我就取每一个浮点数的底部位,然后用64位哈希,除非有人想出什么绝妙的办法。谢谢你的建议。
更新:我刚刚读了你对这个问题的第二次编辑,我建议你使用David's jenkin的方法(我不久前给它投了赞成票)…只需将它指向三个float
s中struct
的最低字节。
关于"无论如何,我认为我只是要取每个浮点数的底部位"-再次,哈希表使用哈希函数的想法不仅仅是将输入中的每个位(直到它们的某个子集)映射到哈希输出中的一个位。这种方式很容易导致大量的碰撞,特别是当桶的数量不是素数时。例如,如果您从每个float
中取出21位,并且当前桶的数量恰好是1024,那么在% 1024之后,仅使用中的一个中的10位,而不考虑其他浮点数的值…对所有c进行Hash (a,b,c) == Hash (d,e,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];
}
};
你可以使用jenkins hash。
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;
}
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 包含 std::list 的结构体的 C++ 初始化
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 如何使用结构体的向量数组?
- 如何使用结构体在C++中更改这些代码?
- 无法在 Mosquitto MQTT Broker 插件上访问结构体 mosquitto 的元素
- 我应该如何在C++中使用结构体解决输入失败的问题?
- Qsort() 比较结构体整数的总和
- 如何使用迭代器指向结构体c++的向量
- 在C++中使用链表的堆栈实现中,访问结构体headNode成员count和top会导致运行时错误
- 如何获取结构体成员的地址
- 创建结构体向量,表达式:向量下标超出范围
- 如何散列一个96位结构体/数字
- 从结构体中生成16位字
- c++位域结构体大小定义(为什么它被包装得更大?)
- 带有位域的结构体的sizeof
- 使用内存变量初始化填充位结构体
- 位操作- c++中对结构体和类的按位操作