Zufälliger Hash in Python


100

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


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


+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


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'

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'

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'

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


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)

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.