Maison > développement back-end > Golang > Existe-t-il une meilleure fonctionnalité de partitionnement pour les clés int64 dans Golang ?

Existe-t-il une meilleure fonctionnalité de partitionnement pour les clés int64 dans Golang ?

PHPz
Libérer: 2024-02-05 22:54:11
avant
1028 Les gens l'ont consulté

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

Contenu de la question

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 ...
}
Copier après la connexion

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 bonne réponse


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

sera évalué à zéro. Il ne s'agit pas d'une distribution uniforme.

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) 
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal