Gibt es überhaupt eine Möglichkeit, eine zufällige Zeichenfolge in eine 8-stellige Zahl umzuwandeln, ohne selbst Algorithmen zu implementieren?
Gibt es überhaupt eine Möglichkeit, eine zufällige Zeichenfolge in eine 8-stellige Zahl umzuwandeln, ohne selbst Algorithmen zu implementieren?
Antworten:
Ja, Sie können die integrierten Hashlib- Module oder die integrierte Hash- Funktion verwenden. Hacken Sie dann die letzten acht Ziffern mit Modulo-Operationen oder String-Slicing-Operationen für die ganzzahlige Form des Hash ab:
>>> 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
Die Antwort von Raymond ist großartig für python2 (allerdings brauchen Sie weder die abs () noch die parens um 10 ** 8). Für Python3 gibt es jedoch wichtige Einschränkungen. Zunächst müssen Sie sicherstellen, dass Sie eine codierte Zeichenfolge übergeben. In den meisten Fällen ist es heutzutage wahrscheinlich auch besser, sich vor sha-1 zu scheuen und stattdessen so etwas wie sha-256 zu verwenden. Der Hashlib-Ansatz wäre also:
>>> import hashlib
>>> s = 'your string'
>>> int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16) % 10**8
80262417
Wenn Sie stattdessen die Funktion hash () verwenden möchten, besteht die wichtige Einschränkung darin, dass das Ergebnis von hash () im Gegensatz zu Python 2.x in Python 3.x nur innerhalb eines Prozesses konsistent ist und nicht über Python-Aufrufe hinweg. Siehe 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
Dies bedeutet, dass die auf hash () basierende Lösung vorgeschlagen wird, die auf nur Folgendes gekürzt werden kann:
hash(s) % 10**8
gibt nur den gleichen Wert innerhalb eines bestimmten Skriptlaufs zurück:
#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
Abhängig davon, ob dies in Ihrer Anwendung von Bedeutung ist (in meiner), möchten Sie sich wahrscheinlich an den hashlib-basierten Ansatz halten.
hashlib.sha256("hello world".encode('utf-8')).hexdigest()[:8]
Hexen verwenden, die immer noch Kollisionen haben
Um die JJC-Antwort zu vervollständigen, ist das Verhalten in Python 3.5.3 korrekt, wenn Sie hashlib folgendermaßen verwenden:
$ 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
Ich teile unsere NodeJs-Implementierung der Lösung, wie sie von @Raymond Hettinger implementiert wurde.
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));