Was ist der einfachste Weg, um einen zufälligen Hash (MD5) in Python zu generieren?
import uuid; uuid.uuid().hex
stackoverflow.com/a/20060712/3218806
Was ist der einfachste Weg, um einen zufälligen Hash (MD5) in Python zu generieren?
import uuid; uuid.uuid().hex
stackoverflow.com/a/20060712/3218806
Antworten:
Ein md5-Hash ist nur ein 128-Bit-Wert. Wenn Sie also einen zufälligen Wert wünschen:
import random
hash = random.getrandbits(128)
print("hash value: %032x" % hash)
Ich verstehe den Punkt jedoch nicht wirklich. Vielleicht sollten Sie näher erläutern, warum Sie das brauchen ...
os.urandom
:''.join('%02x' % ord(x) for x in os.urandom(16))
Ich denke, was Sie suchen, ist eine universelle eindeutige Kennung. Dann ist die Modul-UUID in Python genau das, wonach Sie suchen.
import uuid
uuid.uuid4().hex
UUID4 gibt Ihnen eine zufällige eindeutige Kennung, die dieselbe Länge wie eine MD5-Summe hat. Hex wird als Hex-Zeichenfolge dargestellt, anstatt ein UUID-Objekt zurückzugeben.
Dies funktioniert sowohl für Python 2.x als auch für 3.x.
import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
Das secrets
Modul wurde in Python 3.6+ hinzugefügt. Es bietet kryptografisch sichere Zufallswerte mit einem einzigen Aufruf. Die Funktionen verwenden ein optionales nbytes
Argument. Der Standardwert ist 32 (Bytes * 8 Bit = 256-Bit-Token). MD5 verfügt über 128-Bit-Hashes. Stellen Sie daher 16 für "MD5-ähnliche" Token bereit.
>>> 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'
Noch ein Ansatz. Sie müssen kein int formatieren, um es zu erhalten.
import random
import string
def random_string(length):
pool = string.letters + string.digits
return ''.join(random.choice(pool) for i in xrange(length))
Bietet Ihnen Flexibilität bei der Länge der Zeichenfolge.
>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'
''.join(random.sample(string.ascii_letters + string.digits, 8))
pythonischer?
Ein weiterer Ansatz für diese spezielle Frage:
import random, string
def random_md5like_hash():
available_chars= string.hexdigits[:16]
return ''.join(
random.choice(available_chars)
for dummy in xrange(32))
Ich sage nicht, dass es schneller oder einer anderen Antwort vorzuziehen ist. nur dass es ein anderer Ansatz ist :)
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)
Es sollte auch beachtet werden, dass MD5 eine sehr schwache Hash-Funktion ist. Es wurden auch Kollisionen gefunden (zwei verschiedene Klartextwerte führen zu demselben Hash). Verwenden Sie einfach einen zufälligen Wert für plaintext
.