首頁 >後端開發 >Golang >golang 中 int64 鍵有更好的分片功能嗎?

golang 中 int64 鍵有更好的分片功能嗎?

PHPz
PHPz轉載
2024-02-05 22:54:11991瀏覽

golang 中 int64 键有更好的分片功能吗?

問題內容

我正在使用此儲存庫中的並發映射,在使用newwithcustomshardingfunction 建立映射時可以選擇鍵類型。我只需要為 int64 鍵提供我自己的分片函數,這就是我在這裡使用的。

我還使用最新版本的go ,我可以在其中使用泛型,因此我決定透過實作我自己的分片功能來使用concurrent-map ,密鑰為int64

import (
    cmap "github.com/orcaman/concurrent-map/v2"
)

func shardingFunc(key int64) uint32 {
    return uint32(key) // TODO - create a better sharding function that does not rely on how uint32 type conversion works
}

func main() {
    testMap := cmap.NewWithCustomShardingFunction[int64, *definitions.CustomerProduct](shardingFunc)
    // ... use the map ...
}

我想知道我的分片功能對於 int64 鍵是否可以,或者我應該有更好的分片功能嗎?我不希望出現 index out of range 錯誤或任何其他問題的情況。


正確答案


分片函數是一個雜湊函數。此函數應將密鑰均勻分佈在 32 位元空間上。

如果你的 init64 值的低四位元組是均勻分佈的,那麼 uint32(key) 將用作分片函數。

uint32(key) 是一個錯誤選擇的一個例子是低位元組具有常數值。例如,如果鍵值類似 0x00010000、0x00020000、...,則 uint32(key) 將計算為零。這不是均勻分佈。

如果您不知道 int64 金鑰是如何分佈的,那麼最好在分片函數中使用金鑰的所有位元。這是使用 xor 的一個:

func shardingFunc(key int64) uint32 {
    return uint32(key) ^ uint32(key >> 32) 
}

以上是golang 中 int64 鍵有更好的分片功能嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除