Jaki jest najłatwiejszy sposób generowania losowego skrótu (MD5) w Pythonie?
import uuid; uuid.uuid().hex
stackoverflow.com/a/20060712/3218806
Jaki jest najłatwiejszy sposób generowania losowego skrótu (MD5) w Pythonie?
import uuid; uuid.uuid().hex
stackoverflow.com/a/20060712/3218806
Odpowiedzi:
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 ...
os.urandom
:''.join('%02x' % ord(x) for x in os.urandom(16))
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.
Działa to zarówno dla Pythona 2.x, jak i 3.x.
import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
secrets
Moduł dodano Pythonie 3.6+. Zapewnia kryptograficznie bezpieczne wartości losowe w jednym wywołaniu. Funkcje przyjmują opcjonalny nbytes
argument, 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'
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'
''.join(random.sample(string.ascii_letters + string.digits, 8))
bardziej pytoniczny?
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 :)
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
.