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.
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
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.
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