Hash aleatório em Python

100

Qual é a maneira mais fácil de gerar um hash aleatório (MD5) em Python?

mistero
fonte
1
Aleatório para alguma coisa? Ou por um objeto? Se você quiser apenas um MD5 aleatório, basta escolher alguns números.
samoz
Estou renomeando os arquivos antes de enviar e quero um nome como este: timestamp_randommd5.extension Cheers!
mistero
5
Você pode simplesmente renomeá-los para timestamp_randomnumber.ext. Não há realmente uma razão para que md5 (número aleatório) seja melhor do que o próprio número aleatório.
sth
a melhor resposta para Python 3 é a última import uuid; uuid.uuid().hex stackoverflow.com/a/20060712/3218806
maxbellec

Respostas:

131

Um hash md5 é apenas um valor de 128 bits, então se você quiser um aleatório:

import random

hash = random.getrandbits(128)

print("hash value: %032x" % hash)

Eu realmente não vejo o ponto, no entanto. Talvez você deva explicar porque você precisa disso ...

sth
fonte
+1 para não computar um hash relativamente caro de um número aleatório: esta abordagem é 5x mais rápida.
Nicolas Dumazet
11
+1 - certamente isso é melhor do que minha resposta, também pode ser usado assim: hex (random.getrandbits (128)) [2: -1] isso dá a mesma saída que o método md5 hexdigest.
Jiri
1
a chamada random.seed () é mais ou menos inútil.
tzot
2
Eu teria usado os.urandom porque querer um hash MD5 pode significar querer um seguro.
Desconhecido
9
Veja como fazer isso com os.urandom:''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird
97

Acho que o que você está procurando é um identificador único universal. Então, o módulo UUID em python é o que você está procurando.

import uuid
uuid.uuid4().hex

UUID4 fornece um identificador único aleatório que tem o mesmo comprimento que uma soma md5. Hex representará is como uma string hexadecimal em vez de retornar um objeto uuid.

http://docs.python.org/2/library/uuid.html

sebs
fonte
44

Isso funciona para python 2.xe 3.x

import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
Buttons840
fonte
2
Esta forma de codificação hexadecimal não funciona mais no Python 3.
Caramdir,
1
obrigado. esta é a melhor maneira de criar uma chave hash aleatória.
Jake
7
funciona para 2.xe 3.x: binascii.hexlify (os.urandom (16))
Clay
44

O secretsmódulo foi adicionado no Python 3.6+. Ele fornece valores aleatórios criptograficamente seguros com uma única chamada. As funções têm um nbytesargumento opcional , o padrão é 32 (bytes * 8 bits = tokens de 256 bits). O MD5 tem hashes de 128 bits, portanto, forneça 16 para tokens "semelhantes ao MD5".

>>> import secrets

>>> secrets.token_hex(nbytes=16)
'17adbcf543e851aa9216acc9d7206b96'

>>> secrets.token_urlsafe(16)
'X7NYIolv893DXLunTzeTIQ'

>>> secrets.token_bytes(128 // 8)
b'\x0b\xdcA\xc0.\x0e\x87\x9b`\x93\\Ev\x1a|u'
Nick T
fonte
19

Mais uma abordagem. Você não terá que formatar um int para obtê-lo.

import random
import string

def random_string(length):
    pool = string.letters + string.digits
    return ''.join(random.choice(pool) for i in xrange(length))

Oferece flexibilidade no comprimento da corda.

>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'
Matthew Taylor
fonte
Eu provavelmente mudaria string.letters para 'abcdf' para refletir os dígitos hexadecimais. Mas ótima solução!
ranchalp
''.join(random.sample(string.ascii_letters + string.digits, 8))mais pitônico?
404pio
6

Outra abordagem para esta questão específica:

import random, string

def random_md5like_hash():
    available_chars= string.hexdigits[:16]
    return ''.join(
        random.choice(available_chars)
        for dummy in xrange(32))

Não estou dizendo que é mais rápido ou preferível a qualquer outra resposta; só que é outra abordagem :)

tzot
fonte
5
import uuid
from md5 import md5

print md5(str(uuid.uuid4())).hexdigest()
Sam
fonte
2
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()
moela
fonte
0
from hashlib import md5
plaintext = input('Enter the plaintext data to be hashed: ') # Must be a string, doesn't need to have utf-8 encoding
ciphertext = md5(plaintext.encode('utf-8').hexdigest())
print(ciphertext)

Também deve ser notado que MD5 é uma função hash muito fraca, também foram encontradas colisões (dois valores de texto simples diferentes resultam no mesmo hash) Basta usar um valor aleatório para plaintext.

Eric Jin
fonte
Exigir a entrada do usuário não ajuda no aspecto "mais fácil" da pergunta original ...
AS Mackay
Você checou seu código? Está faltando um parêntese na linha 3.
ingyhere