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