randint how float example python arrays algorithm random hash

how - random.sample python



Python: ¿cómo hash una cadena en 8 dígitos? (3)

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


La respuesta de Raymond es excelente para python2 (aunque no necesitas los abdominales () ni los parens alrededor de 10 ** 8). Sin embargo, para python3, hay advertencias importantes. 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 el sha-1 y usar algo como sha-256. 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 (), 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 la solución basada en hash (), que puede acortarse 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 importa en su aplicación (lo hizo en la mía), probablemente quiera apegarse al enfoque basado en hashlib.


Sí, puede usar los módulos hashlib 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


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