Zufälliger Hash in Python

100

Was ist der einfachste Weg, um einen zufälligen Hash (MD5) in Python zu generieren?

Mistero
quelle
1
Zufällig wie für irgendetwas? Oder für ein Objekt? Wenn Sie nur eine zufällige MD5 wollen, wählen Sie einfach einige Zahlen.
Samoz
Ich benenne Dateien vor dem Hochladen um und möchte einen Dateinamen wie diesen: timestamp_randommd5.extension Cheers!
Mistero
5
Sie können sie einfach in timestamp_randomnumber.ext umbenennen. Es gibt wirklich keinen Grund, warum md5 (Zufallszahl) besser wäre als die Zufallszahl selbst.
etw
Die beste Antwort für Python 3 ist die letzte auf import uuid; uuid.uuid().hex stackoverflow.com/a/20060712/3218806
maxbellec

Antworten:

131

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 ...

etw
quelle
+1 für die Nichtberechnung eines relativ teuren Hashs aus einer Zufallszahl: Dieser Ansatz ist 5x schneller.
Nicolas Dumazet
11
+1 - sicherlich ist dies besser als meine Antwort, kann auch so verwendet werden: hex (random.getrandbits (128)) [2: -1] Dies gibt Ihnen die gleiche Ausgabe wie die hexdigest-Methode md5.
Jiri
1
Der Aufruf von random.seed () ist mehr oder weniger nutzlos.
tzot
2
Ich hätte os.urandom verwendet, weil der Wunsch nach einem MD5-Hash den Wunsch nach einem sicheren bedeuten könnte.
Unbekannt
9
So geht's os.urandom:''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird
97

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.

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

sebs
quelle
44

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'
Buttons840
quelle
2
Diese Art der hexadezimalen Codierung funktioniert in Python 3 nicht mehr.
Caramdir
1
Vielen Dank. Dies ist der beste Weg, um einen zufälligen Hash-Schlüssel zu erstellen.
Jake
7
funktioniert für 2.x und 3.x: binascii.hexlify (os.urandom (16))
Clay
44

Das secretsModul wurde in Python 3.6+ hinzugefügt. Es bietet kryptografisch sichere Zufallswerte mit einem einzigen Aufruf. Die Funktionen verwenden ein optionales nbytesArgument. 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'
Nick T.
quelle
19

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'
Matthew Taylor
quelle
Ich würde string.letters wahrscheinlich in 'abcdf' ändern, um hexadezimale Ziffern wiederzugeben. Aber tolle Lösung!
Ranchalp
''.join(random.sample(string.ascii_letters + string.digits, 8))pythonischer?
404pio
6

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 :)

tzot
quelle
5
import uuid
from md5 import md5

print md5(str(uuid.uuid4())).hexdigest()
Sam
quelle
2
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()
Gizzmole
quelle
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)

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.

Eric Jin
quelle
Das Erfordernis von Benutzereingaben hilft nicht beim "einfachsten" Aspekt der ursprünglichen Frage ...
AS Mackay
Hast du deinen Code überprüft? Es fehlt ein Paren in Zeile 3.
Ingyhere