Hash aleatório em Python


100

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


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 ...


+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


44

Isso funciona para python 2.xe 3.x

import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'

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'

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'

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 :)


5
import uuid
from md5 import md5

print md5(str(uuid.uuid4())).hexdigest()

2
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.