C'è comunque che posso hash una stringa casuale in un numero di 8 cifre senza implementare alcun algoritmo da solo?
C'è comunque che posso hash una stringa casuale in un numero di 8 cifre senza implementare alcun algoritmo da solo?
Risposte:
Sì, puoi utilizzare i moduli hashlib incorporati o la funzione hash incorporata. Quindi, elimina le ultime otto cifre utilizzando le operazioni modulo o le operazioni di suddivisione delle stringhe nella forma intera dell'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
La risposta di Raymond è ottima per python2 (però, non hai bisogno dell'abs () né delle parentesi intorno a 10 ** 8). Tuttavia, per python3, ci sono importanti avvertenze. Innanzitutto, assicurati di passare una stringa codificata. In questi giorni, nella maggior parte delle circostanze, è probabilmente anche meglio evitare sha-1 e usare invece qualcosa come sha-256. Quindi, l'approccio hashlib sarebbe:
>>> import hashlib
>>> s = 'your string'
>>> int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16) % 10**8
80262417
Se invece si desidera utilizzare la funzione hash (), l'avvertenza importante è che, a differenza di Python 2.x, in Python 3.x, il risultato di hash () sarà coerente solo all'interno di un processo, non tra le invocazioni di Python. Vedere qui:
$ 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
Ciò significa che viene suggerita la soluzione basata su hash (), che può essere ridotta a:
hash(s) % 10**8
restituirà lo stesso valore solo all'interno di una determinata esecuzione di script:
#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
Quindi, a seconda se questo è importante nella tua applicazione (lo era nella mia), probabilmente vorrai attenersi all'approccio basato su hashlib.
hashlib.sha256("hello world".encode('utf-8')).hexdigest()[:8]
strega continuerà ad avere collisioni
Solo per completare la risposta JJC, in python 3.5.3 il comportamento è corretto se usi hashlib in questo modo:
$ 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
Condivido la nostra implementazione nodejs della soluzione implementata da @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));