Nombre entier positif de la fonction hash () de Python
Je veux utiliser le Python hash()
fonction pour obtenir entier à partir de hachages des objets. Mais intégrée dans hash()
peut donner des valeurs négatives, et je ne veux que du positif. Et je veux qu'il fonctionne sensiblement sur les deux versions 32 bits et 64 bits des plates-formes.
I. e. sur 32 bits Python, hash()
peut retourner un entier dans la plage de -2**31
à 2**31 - 1
.
Sur les systèmes 64 bits, hash()
peut retourner un entier dans la plage de -2**63
à 2**63 - 1
.
Mais je veux un hachage de la gamme 0
à 2**32-1
sur les systèmes 32 bits, et 0
à 2**64-1
sur les systèmes 64 bits.
Quel est le meilleur moyen de convertir la valeur de hachage pour l'équivalent de sa valeur positive au sein de la gamme de la version 32 ou 64 bits plate-forme cible?
(Contexte: je suis en train de faire une nouvelle random.Random
classe de style. Selon le aléatoire.Aléatoire.de la graine()
docsla graine "argument optionnel x peut être n'importe quel hashable de l'objet." Donc je voudrais dupliquer cette fonctionnalité, sauf que ma graine algorithme ne peut pas gérer les négatifs des valeurs entières, seul point positif.)
source d'informationauteur Craig McQueen
Vous devez vous connecter pour publier un commentaire.
À l'aide de
sys.maxsize
:Alternative à l'aide
ctypes.c_size_t
:Juste en utilisant
sys.maxsize
est faux, pour des raisons évidentes (`2*n-1 et non pas 2*n), mais la solution est assez simple:pour des raisons de performances, vous pouvez scinder le sys.maxsize + 1 en deux affectations pour éviter la création d'un entier long temporairement pour la plupart des nombres négatifs. Bien que je doute que cela va beaucoup
Comment sur:
Il utilise
sys.maxsize
pour être portable entre les versions 32 et 64 bits des systèmes.(Edit: j'ai d'abord cru que vous avez toujours voulu une valeur de 32 bits)
Simplement ET avec un masque de la taille désirée. Généralement
sys.maxsize
sera déjà un tel masque, car c'est une puissance de 2 moins 1.