Maison >développement back-end >Golang >Existe-t-il une meilleure fonctionnalité de partitionnement pour les clés int64 dans Golang ?
J'utilise la carte simultanée de ce référentiel, fournissant ma propre fonction de partitionnement à l'aide de la touche newwithcustomshardingfunction
创建映射时可以选择键类型。我只需要为 int64
, que j'utilise ici.
J'utilise également la dernière version de 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 ... }
Je veux savoir ce qui se passe avec ma fonction de partitionnement pour int64
键是否可以,或者我应该有更好的分片功能吗?我不希望出现 index out of range
erreurs ou tout autre problème.
La fonction de partage est une fonction de hachage. Cette fonction doit répartir uniformément la clé sur l'espace 32 bits.
Si les quatre octets inférieurs de votre valeur init64 sont répartis uniformément, alors uint32(key)
sera utilisé comme fonction de partitionnement.
uint32(key)
是一个错误选择的一个例子是低字节具有常量值。例如,如果键值类似于 0x00010000、0x00020000、...,则 uint32(key)
Un exemple de mauvais choix est lorsque l'octet de poids faible a une valeur constante. Par exemple, si la valeur clé ressemble à 0x00010000, 0x00020000, ..., alors
Si vous ne savez pas comment la clé int64 est distribuée, il est préférable d'utiliser tous les bits de la clé dans la fonction de partitionnement. En voici un utilisant xor : 🎜
func shardingFunc(key int64) uint32 { return uint32(key) ^ uint32(key >> 32) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!