[英]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.