繁体   English   中英

使用多个uint32_t整数生成uint64_t哈希键

[英]Generate uint64_t hash key with several uint32_t integers

我面临着与Eduardo相同的问题( 为多个整数生成一个哈希值 ),但是我的标题稍有不同。

我有四个32位整数,我需要生成一个64位唯一密钥。 我现在所做的是生成由'/'分隔的四个整数的字符串连接,然后使用该字符串生成CRC。

char id_s[64];
sprintf(id_s, "%d/%d/%d/%d", a, b, c, d);
uint64_t id = CRC(id_s);

但是问题是我必须做几百万遍,所以这似乎非常消耗CPU。 因此,我正在考虑将四个整数直接存储为一个整数。

如果四个整数为16位整数,则可以轻松完成此操作。 只需使用移位运算符即可完成。

uint64_t id = a << 48 + b << 32 + c << 16 + d;

对于四个32位整数,我必须将128位放入单个64位整数中。

有人有什么建议吗?

我认为您最好的选择是使用xor:

  uint64_t makeId(uint32_t a, uint32_t b, uint32_t c, uint32_t d)
  {
     uint64_t id = a;
     id <<=11;
     id ^= b;
     id <<=11;
     id ^= c;
     id <<=10;
     id ^=d;

     return id;
  }

如果您的输入分布良好并使用所有32位,则此方法会很好地工作。 就像Mark所说的那样,没有重复就无法将128位转换为64位。

根据您输入数据的性质,类似您建议的内容可能会正常工作:

uint64_t id = static_cast<uint64_t>(a & 0xFFFFu) << 48 + static_cast<uint64_t>(b & 0xFFFFu) << 32 + static_cast<uint64_t>(c & 0xFFFFu) << 16 + static_cast<uint64_t>(d & 0xFFFFu);

只要值的高位相当恒定而低位相对随机,就可以使您接近。 您试图将128位数据填充为64位,因此必须将数据丢弃在某个地方。 这只是要丢弃哪些位以及如何操作的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM