如何散列一个96位结构体/数字

How to hash a 96-bit struct/number?

本文关键字:96位 结构体 数字 一个 何散列      更新时间:2023-10-16

所以我不知道如何在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;
}