Existe-t-il de toute façon que je puisse hacher une chaîne aléatoire en un nombre à 8 chiffres sans implémenter moi-même d'algorithmes?
Existe-t-il de toute façon que je puisse hacher une chaîne aléatoire en un nombre à 8 chiffres sans implémenter moi-même d'algorithmes?
Réponses:
Oui, vous pouvez utiliser les modules hashlib intégrés ou la fonction de hachage intégrée. Ensuite, coupez les huit derniers chiffres à l'aide d'opérations modulo ou d'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).hexdigest(), 16) % (10 ** 8)
58097614L
>>> # Use hash()
>>> abs(hash(s)) % (10 ** 8)
82148974
La réponse de Raymond est excellente pour python2 (cependant, vous n'avez pas besoin des abs () 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 est probablement préférable d'éviter 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 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 que dans un processus, pas entre les invocations python. Vois 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 à seulement:
hash(s) % 10**8
ne renverra la même valeur que 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
Donc, selon que cela compte dans votre application (c'est le cas dans la mienne), vous voudrez probablement vous en tenir à l'approche basée sur hashlib.
hashlib.sha256("hello world".encode('utf-8')).hexdigest()[:8]
sorcière qui aura encore des collisions
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
Je partage notre implémentation nodejs de la solution 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));