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.