Maison >développement back-end >Golang >Comment générer des entiers déterministes et uniques à partir de nombres d'entrée ?

Comment générer des entiers déterministes et uniques à partir de nombres d'entrée ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-23 08:38:50902parcourir

How to Generate Deterministic and Unique Integers from Input Numbers?

Génération de nombres déterministes et uniques

Étant donné la nécessité de générer des entiers déterministes qui correspondent de manière unique à chaque nombre d'entrée, cela peut sembler impossibleЗадача . Cependant, il existe une formule mathématique qui peut remplir cette exigence.

Formule de transformation

La formule de transformation est dérivée de l'arithmétique modulaire :

f(P) = (mP + s) mod n

où :

  • P est le nombre d'entrée
  • m est un nombre impair le nombre premier avec n
  • s est un nombre aléatoire inférieur à n
  • n est la plage de valeurs à générer (par exemple, 2^64 pour uint64)

Cette formule garantit que chaque entrée P correspond à une sortie unique comprise entre 0 et n-1. La condition de coprimalité pour m empêche les facteurs communs entre m et n, éliminant ainsi les modèles périodiques et les collisions.

Exemple d'implémentation pour uint64

Pour une plage uint64, les valeurs de paramètres suivantes peut être utilisé :

var (
    m = uint64(39293)
    s = uint64(75321908)
)

func transform(p uint64) uint64 {
    return p*m + s
}

Extension à int64

Pour les nombres signés (int64), une approche similaire peut être utilisée. La transformation originale pour uint64 est appliquée après la conversion de l'entrée et de la sortie vers et depuis uint64 :

func signedTransform(p int64) int64 {
    return int64(transform(uint64(p)))
}

En utilisant ce schéma de génération de nombres déterministe et unique, il devient possible de mapper les nombres d'entrée à des sorties uniques sans nécessiter un tableau ou tri gourmand en mémoire.

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!

Déclaration:
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