190 votes

Comment hacher une chaîne de caractères en 8 chiffres ?

Est-il possible de hacher une chaîne aléatoire en un nombre à 8 chiffres sans implémenter d'algorithme moi-même ?

253voto

Raymond Hettinger Points 231

Oui, vous pouvez utiliser la fonction intégrée hashlib ou le module intégré hash fonction. Ensuite, coupez les huit derniers chiffres en utilisant des opérations modulo ou des opérations de découpage 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.encode("utf-8")).hexdigest(), 16) % (10 ** 8)
58097614L

>>> # Use hash()
>>> abs(hash(s)) % (10 ** 8)
82148974

172voto

JJC Points 1505

La réponse de Raymond est excellente pour python2 (cependant, vous n'avez pas besoin de abs() ni des parenthèses 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 est probablement préférable d'éviter sha-1 et d'utiliser plutôt quelque chose comme sha-256. Ainsi, l'approche de 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, dans Python 3.x, le résultat de hash() ne sera cohérent qu'au sein d'un processus, et non entre les invocations de 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 que la solution suggérée basée sur hash(), qui peut être raccourcie à juste :

hash(s) % 10**8

ne retournera la même valeur qu'à l'intérieur d'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

Ainsi, selon l'importance de cet aspect dans votre application (c'était le cas dans la mienne), vous voudrez probablement vous en tenir à l'approche basée sur la hashlib.

13voto

user8948052 Points 101

Pour compléter la réponse de 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

-11voto

Je partage notre implémentation nodejs de la solution telle qu'implémentée par @Raymond Hettinger.

var crypto = require('crypto');
var s = 'she sells sea shells by the sea shore';
console.log(BigInt('0x' + crypto.createHash('sha1').update(s).digest('hex'))%(10n ** 8n));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X