¿Hay alguna forma de que pueda convertir una cadena aleatoria en un número de 8 dígitos sin implementar ningún algoritmo yo mismo?
¿Hay alguna forma de que pueda convertir una cadena aleatoria en un número de 8 dígitos sin implementar ningún algoritmo yo mismo?
Respuestas:
Sí, puede utilizar los módulos hashlib incorporados o la función hash incorporada. Luego, corte los últimos ocho dígitos usando operaciones de módulo o operaciones de corte de cadenas en la forma entera del 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 respuesta de Raymond es excelente para python2 (sin embargo, no necesita el abs () ni el parens alrededor de 10 ** 8). Sin embargo, para python3, existen importantes advertencias. Primero, deberá asegurarse de pasar una cadena codificada. En estos días, en la mayoría de las circunstancias, probablemente también sea mejor evitar sha-1 y usar algo como sha-256 en su lugar. Entonces, el enfoque de hashlib sería:
>>> import hashlib
>>> s = 'your string'
>>> int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16) % 10**8
80262417
Si desea utilizar la función hash () en su lugar, la advertencia importante es que, a diferencia de Python 2.x, en Python 3.x, el resultado de hash () solo será coherente dentro de un proceso, no entre las invocaciones de Python. Mira aquí:
$ 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
Esto significa la solución basada en hash () sugerida, que se puede acortar a solo:
hash(s) % 10**8
solo devolverá el mismo valor dentro de una ejecución de script determinada:
#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
Entonces, dependiendo de si esto es importante en su aplicación (lo hizo en la mía), probablemente querrá ceñirse al enfoque basado en hashlib.
hashlib.sha256("hello world".encode('utf-8')).hexdigest()[:8]
bruja todavía tendrá colisiones
Solo para completar la respuesta de JJC, en Python 3.5.3 el comportamiento es correcto si usa hashlib de esta manera:
$ 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
Estoy compartiendo nuestra implementación de nodejs de la solución implementada por @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));