Vraag Python: Hoe kan ik een string in 8 cijfers hashen?


Is er hoe dan ook dat ik een willekeurige reeks in een achtcijferig nummer kan hashen zonder zelf algoritmen te implementeren? Bedankt.


39
2018-04-15 06:10


oorsprong


antwoorden:


Ja, je kunt de ingebouwde gebruiken hashlib modules of de ingebouwde hachee functie. Snijd vervolgens de laatste acht cijfers af met behulp van modulo-bewerkingen of string-slicing-bewerkingen op de integer-vorm van de hash:

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

73
2018-04-15 06:17



Raymond's antwoord is geweldig voor python2 (hoewel je de abs () noch de parens rond 10 ** 8 nodig hebt). Voor python3 zijn er echter belangrijke kanttekeningen. Eerst moet je ervoor zorgen dat je een gecodeerde reeks doorgeeft. Tegenwoordig is het in de meeste gevallen waarschijnlijk ook beter om niet langer sha-1 te gebruiken en in plaats daarvan sha-256 te gebruiken. Dus de hashlib-aanpak zou zijn:

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

Als je in plaats daarvan de hash () -functie wilt gebruiken, is de belangrijkste waarschuwing dat, in tegenstelling tot Python 2.x, in Python 3.x, het resultaat van hash () alleen consistent is in een proces, niet over python-aanroepingen. Kijk hier:

$ 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

Dit betekent dat de op hash () - gebaseerde oplossing wordt voorgesteld, die kan worden ingekort tot:

hash(s) % 10**8

retourneert alleen dezelfde waarde binnen een bepaalde scriptrun:

#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

Dus, afhankelijk van of dit in uw toepassing van belang is (in de mijne), wilt u waarschijnlijk vasthouden aan de op hashlib gebaseerde aanpak.


28
2018-02-07 11:57



Gewoon om het antwoord van JJC te voltooien, in python 3.5.3 is het gedrag correct als je hashlib op deze manier gebruikt:

$ 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
2017-11-15 22:02