Losowy hash w Pythonie

100

Jaki jest najłatwiejszy sposób generowania losowego skrótu (MD5) w Pythonie?

mistero
źródło
1
Losowo, jak na coś? Albo dla przedmiotu? Jeśli chcesz tylko losowego MD5, po prostu wybierz kilka liczb.
samoz
Zmieniam nazwy plików przed załadowaniem i chcę mieć taką nazwę: timestamp_randommd5.extension Pozdrawiam!
mistero
5
Możesz po prostu zmienić ich nazwę na timestamp_randomnumber.ext. Naprawdę nie ma powodu, dla którego md5 (liczba losowa) byłaby lepsza niż sama liczba losowa.
sth
najlepszą odpowiedzią dla Pythona 3 jest ostatnia import uuid; uuid.uuid().hex stackoverflow.com/a/20060712/3218806
maxbellec

Odpowiedzi:

131

Skrót md5 to tylko 128-bitowa wartość, więc jeśli chcesz mieć losowy:

import random

hash = random.getrandbits(128)

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

Jednak naprawdę nie widzę sensu. Może powinieneś wyjaśnić, dlaczego tego potrzebujesz ...

sth
źródło
+1 za brak obliczania stosunkowo drogiego hasha z liczby losowej: to podejście jest 5x szybsze.
Nicolas Dumazet
11
+1 - na pewno jest to lepsze niż moja odpowiedź, może być również użyte w ten sposób: hex (random.getrandbits (128)) [2: -1] daje to takie samo wyjście, jak metoda md5 hexdigest.
Jiri
1
wywołanie random.seed () jest mniej więcej bezużyteczne.
tzot
2
Użyłbym os.urandom, ponieważ chęć posiadania skrótu MD5 może oznaczać potrzebę bezpiecznego.
Nieznany
9
Oto jak to zrobić z os.urandom:''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird
98

Myślę, że szukasz uniwersalnego, unikalnego identyfikatora, a więc moduł UUID w pythonie jest tym, czego szukasz.

import uuid
uuid.uuid4().hex

UUID4 daje losowy unikalny identyfikator, który ma taką samą długość jak suma md5. Hex będzie reprezentować jako ciąg szesnastkowy zamiast zwracać obiekt uuid.

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

sebs
źródło
44

Działa to zarówno dla Pythona 2.x, jak i 3.x.

import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
Przyciski840
źródło
2
Ten sposób kodowania szesnastkowego nie działa już w Pythonie 3.
Caramdir,
1
dzięki. jest to najlepszy sposób na utworzenie losowego klucza mieszającego.
Jake,
7
działa dla 2.x i 3.x: binascii.hexlify (os.urandom (16))
Clay
44

secretsModuł dodano Pythonie 3.6+. Zapewnia kryptograficznie bezpieczne wartości losowe w jednym wywołaniu. Funkcje przyjmują opcjonalny nbytesargument, domyślnie 32 (bajty * 8 bitów = tokeny 256-bitowe). MD5 ma 128-bitowe skróty, więc podaj 16 dla tokenów „podobnych do 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.
źródło
19

Jeszcze inne podejście. Nie będziesz musiał formatować int, aby go uzyskać.

import random
import string

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

Daje elastyczność co do długości sznurka.

>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'
Matthew Taylor
źródło
Prawdopodobnie zmieniłbym string.letters na „abcdf”, aby odzwierciedlić cyfry szesnastkowe. Ale świetne rozwiązanie!
ranchalp
''.join(random.sample(string.ascii_letters + string.digits, 8))bardziej pytoniczny?
404pio
6

Inne podejście do tego konkretnego pytania:

import random, string

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

Nie mówię, że jest to szybsze lub lepsze od jakiejkolwiek innej odpowiedzi; tylko że to inne podejście :)

tzot
źródło
5
import uuid
from md5 import md5

print md5(str(uuid.uuid4())).hexdigest()
Sam
źródło
2
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()
gizzmole
źródło
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)

Należy również zauważyć, że MD5 jest bardzo słabą funkcją haszującą, znaleziono również kolizje (dwie różne wartości tekstu jawnego dają ten sam hash) Po prostu użyj losowej wartości dla plaintext.

Eric Jin
źródło
Wymaganie udziału użytkownika nie pomaga w „najłatwiejszym” aspekcie pierwotnego pytania ...
AS Mackay,
Czy sprawdziłeś swój kod? Brakuje parena na linii 3.
ingyhere