Hash casuale in Python


100

Qual è il modo più semplice per generare un hash casuale (MD5) in Python?


1
Casuale come per niente? O per un oggetto? Se vuoi solo un MD5 casuale, scegli solo alcuni numeri.
samoz

Sto rinominando i file prima di caricarli e desidero un nome file come questo: timestamp_randommd5.extension Cheers!
mistero

5
Potresti semplicemente rinominarli in timestamp_randomnumber.ext. Non c'è davvero un motivo per cui md5 (randomnumber) sarebbe migliore dello stesso randomnumber.
sth

migliore risposta per Python 3 è l'ultimo import uuid; uuid.uuid().hex stackoverflow.com/a/20060712/3218806
maxbellec

Risposte:


131

Un hash md5 è solo un valore a 128 bit, quindi se ne vuoi uno casuale:

import random

hash = random.getrandbits(128)

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

Non vedo davvero il punto, però. Forse dovresti spiegare perché hai bisogno di questo ...


+1 per non calcolare un hash relativamente costoso da un numero casuale: questo approccio è 5 volte più veloce.
Nicolas Dumazet,

11
+1 - sicuramente questo è meglio della mia risposta, può essere usato anche in questo modo: hex (random.getrandbits (128)) [2: -1] questo ti dà lo stesso output del metodo hexdigest md5.
Jiri,

1
la chiamata random.seed () è più o meno inutile.
tzot

2
Avrei usato os.urandom perché volere un hash MD5 potrebbe significare volerne uno sicuro.
Sconosciuto,

9
Ecco come farlo con os.urandom:''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird

97

Penso che quello che stai cercando sia un identificatore univoco universale, quindi l'UUID del modulo in python è quello che stai cercando.

import uuid
uuid.uuid4().hex

UUID4 ti fornisce un identificatore univoco casuale che ha la stessa lunghezza di una somma md5. Hex rappresenterà è come una stringa esadecimale invece di restituire un oggetto uuid.

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


44

Funziona sia per python 2.x che per 3.x

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

2
Questo modo di codifica esadecimale non funziona più in Python 3.
Caramdir

1
Grazie. questo è il modo migliore per creare una chiave hash casuale.
Jake

7
funziona per 2.xe 3.x: binascii.hexlify (os.urandom (16))
Clay

44

Il secretsmodulo è stato aggiunto in Python 3.6+. Fornisce valori casuali protetti crittograficamente con una singola chiamata. Le funzioni accettano un nbytesargomento opzionale , il valore predefinito è 32 (byte * 8 bit = token a 256 bit). MD5 ha hash a 128 bit, quindi fornisci 16 per i token "simili a 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

Ancora un altro approccio. Non dovrai formattare un int per ottenerlo.

import random
import string

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

Offre flessibilità sulla lunghezza della corda.

>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'

Probabilmente cambierei string.letters in "abcdf" per riflettere le cifre esadecimali. Ma ottima soluzione!
ranchalp

''.join(random.sample(string.ascii_letters + string.digits, 8))più pitonico?
404pio

6

Un altro approccio a questa domanda specifica:

import random, string

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

Non sto dicendo che sia più veloce o preferibile a qualsiasi altra risposta; solo che è un altro approccio :)


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)

Va anche notato che MD5 è una funzione hash molto debole, inoltre sono state trovate collisioni (due diversi valori di testo in chiaro producono lo stesso hash) Usa semplicemente un valore casuale per plaintext.


Richiedere l'input dell'utente non aiuta con l'aspetto "più semplice" della domanda originale ...
AS Mackay

Hai controllato il tuo codice? Manca una parentesi sulla linea 3.
qui
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.