web-dev-qa-db-fra.com

Comment découper une chaîne en 8 chiffres?

Y a-t-il un moyen de hacher une chaîne aléatoire en un nombre de 8 chiffres sans implémenter moi-même d'algorithmes?

66
dorafmon

Oui, vous pouvez utiliser les modules intégrés hashlib ou les modules intégrés hash fonction. Ensuite, coupez les huit derniers chiffres à l’aide d’opérations modulo ou de tranchage de chaînes 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
108
Raymond Hettinger

La réponse de Raymond est excellente pour python2 (cependant, vous n'avez pas besoin des abdominaux () ni des parens autour de 10 ** 8). Cependant, pour Python3, il y a des mises en garde importantes. Tout d'abord, vous devez vous assurer que vous transmettez une chaîne codée. De nos jours, dans la plupart des cas, il vaut probablement mieux éviter de sha-1 et 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 souhaitez utiliser la fonction hash () à la place, la mise en garde importante est que, contrairement à Python 2.x, à Python 3.x, le Le résultat de hash () ne sera cohérent que dans un processus, pas à 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 réduite à simplement:

hash(s) % 10**8

renverra uniquement la même valeur dans une exécution de script donnée:

#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

Ainsi, selon que cela compte dans votre application (ce qui est le cas dans la mienne), vous voudrez probablement vous en tenir à l'approche basée sur hashlib.

55
JJC

Juste pour compléter la réponse JJC, dans 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
2
user8948052