Python: comment Hasher une chaîne en 8 chiffres?

y a-t-il de toute façon que je puisse hacher une chaîne aléatoire dans un nombre à 8 chiffres sans implémenter d'algorithmes moi-même? Grâce.

44
demandé sur Raymond Hettinger 2013-04-15 10:10:19

3 réponses

Oui, vous pouvez utiliser le haut - hashlib modules ou les hash fonction. Ensuite, coupez les huit derniers chiffres en utilisant des opérations modulo ou des opérations de tranchage de chaîne sur la forme entière du hachage:

>>> s = 'she sells sea shells by the sea shore'

>>> # Use hashlib
>>> import hashlib
>>> int(hashlib.sha1(s).hexdigest(), 16) % (10 ** 8)
58097614L

>>> # Use hash()
>>> abs(hash(s)) % (10 ** 8)
82148974
80
répondu Raymond Hettinger 2015-04-09 02:17:17

la réponse de Raymond est bonne pour python2 (cependant, vous n'avez pas besoin de l'abs() ni des parens autour de 10 ** 8). Cependant, pour python3, il y a des mises en garde. Tout d'abord, vous devez vous assurer que vous passez une chaîne codée. Ces jours-ci, dans la plupart des circonstances, il est probablement aussi préférable de se détourner de sha-1 et d'utiliser quelque chose comme sha-256, à la place. Ainsi, l'approche hashlib serait:

>>> import hashlib
>>> s = 'your string'
>>> int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16) % 10**8
80262417

si vous voulez utiliser la fonction hash() à la place, la mise en garde importante est que, contrairement à Python 2.x, En Python 3.x, le résultat de hash() ne sera cohérent qu'à l'intérieur d'un processus, et non à travers les invocations python. Voir ici:

$ python -V
Python 2.7.5
$ python -c 'print(hash("foo"))'
-4177197833195190597
$ python -c 'print(hash("foo"))'
-4177197833195190597

$ python3 -V
Python 3.4.2
$ python3 -c 'print(hash("foo"))'
5790391865899772265
$ python3 -c 'print(hash("foo"))'
-8152690834165248934

cela signifie la solution basée sur hash () suggérée, qui peut être raccourcie à juste:

hash(s) % 10**8

retournera seulement la même valeur dans un script donné:

#Python 2:
$ python2 -c 's="your string"; print(hash(s) % 10**8)'
52304543
$ python2 -c 's="your string"; print(hash(s) % 10**8)'
52304543

#Python 3:
$ python3 -c 's="your string"; print(hash(s) % 10**8)'
12954124
$ python3 -c 's="your string"; print(hash(s) % 10**8)'
32065451

donc, selon si cela compte dans votre application( c'est le cas dans la mienne), vous voudrez probablement vous en tenir au hashlib basé approche.

30
répondu JJC 2017-02-07 11:57:54

juste pour compléter la réponse JJC, en python 3.5.3 le comportement est correct si vous utilisez hashlib de cette façon:

$ python3 -c '
import hashlib
hash_object = hashlib.sha256(b"Caroline")
hex_dig = hash_object.hexdigest()
print(hex_dig)
'
739061d73d65dcdeb755aa28da4fea16a02b9c99b4c2735f2ebfa016f3e7fded
$ python3 -c '
import hashlib
hash_object = hashlib.sha256(b"Caroline")
hex_dig = hash_object.hexdigest()
print(hex_dig)
'
739061d73d65dcdeb755aa28da4fea16a02b9c99b4c2735f2ebfa016f3e7fded

$ python3 -V
Python 3.5.3
0
répondu user8948052 2017-11-15 22:02:45