如何散列96位结构/数字?

时间:2014-08-07 03:22:42

标签: c++ hash binary bits

所以我无法弄清楚如何在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位散列,除非有人想出一些精彩的东西。感谢您的建议到目前为止。

2 个答案:

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