¿Cómo hash una cadena en 8 dígitos?

¿Hay alguna forma en que pueda agrupar una cadena aleatoria en un número de 8 dígitos sin implementar ningún algoritmo?

Sí, puede usar 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 cadena 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 genial para python2 (aunque, no necesitas los abdominales () ni los parens alrededor de 10 ** 8). Sin embargo, para python3, hay advertencias importantes. Primero, deberás asegurarte de que estás pasando una cadena codificada. En estos días, en la mayoría de las circunstancias, probablemente también sea mejor alejarse de sha-1 y usar algo como sha-256. Entonces, el enfoque hashlib sería:

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

Si quiere usar 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 a través de 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 que se sugiere una solución basada en hash (), que se puede reducir a:

hash(s) % 10**8

solo devolverá el mismo valor dentro de un script dado:

 #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á seguir el enfoque basado en hashlib.

Solo para completar la respuesta de JJC, en Python 3.5.3 el comportamiento es correcto si usas 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