Heim > Backend-Entwicklung > Golang > Gibt es eine bessere Sharding-Funktionalität für int64-Schlüssel in Golang?

Gibt es eine bessere Sharding-Funktionalität für int64-Schlüssel in Golang?

PHPz
Freigeben: 2024-02-05 22:54:11
nach vorne
988 Leute haben es durchsucht

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

Frageninhalt

Ich verwende die Concurrent Map aus diesem Repository und stelle meine eigene Sharding-Funktion mit der newwithcustomshardingfunction 创建映射时可以选择键类型。我只需要为 int64-Taste bereit, die ich hier verwende.

Ich verwende auch die neueste Version von 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 ...
}
Nach dem Login kopieren

Ich möchte wissen, was mit meiner Sharding-Funktion bei int64 键是否可以,或者我应该有更好的分片功能吗?我不希望出现 index out of range Fehlern oder anderen Problemen passiert.


Die richtige Antwort


Die Sharding-Funktion ist eine Hash-Funktion. Diese Funktion sollte den Schlüssel gleichmäßig über den 32-Bit-Bereich verteilen.

Wenn die unteren vier Bytes Ihres init64-Werts gleichmäßig verteilt sind, wird uint32(key) als Sharding-Funktion verwendet.

uint32(key) 是一个错误选择的一个例子是低字节具有常量值。例如,如果键值类似于 0x00010000、0x00020000、...,则 uint32(key) Ein Beispiel für eine schlechte Wahl ist, wenn das Low-Byte einen konstanten Wert hat. Wenn der Schlüsselwert beispielsweise wie 0x00010000, 0x00020000, ... aussieht, wird

als Null ausgewertet. Dies ist keine gleichmäßige Verteilung.

Wenn Sie nicht wissen, wie der int64-Schlüssel verteilt ist, ist es besser, alle Teile des Schlüssels in der Sharding-Funktion zu verwenden. Hier ist eine, die xor verwendet: 🎜
func shardingFunc(key int64) uint32 {
    return uint32(key) ^ uint32(key >> 32) 
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonGibt es eine bessere Sharding-Funktionalität für int64-Schlüssel in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage