簡體   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