Hash acak dengan Python

100

Apa cara termudah untuk menghasilkan hash acak (MD5) dengan Python?

mistero
sumber
1
Acak untuk apa saja? Atau untuk sebuah benda? Jika Anda hanya ingin MD5 acak, pilih saja beberapa angka.
samoz
Saya mengganti nama file sebelum mengupload dan menginginkan nama file seperti ini: timestamp_randommd5.extension Cheers!
mistero
5
Anda bisa mengganti namanya menjadi timestamp_randomnumber.ext. Sebenarnya tidak ada alasan mengapa md5 (randomnumber) akan lebih baik dari randomnumber itu sendiri.
Sth
jawaban terbaik untuk Python 3 adalah yang terakhir import uuid; uuid.uuid().hex stackoverflow.com/a/20060712/3218806
maxbellec

Jawaban:

131

Sebuah md5-hash hanyalah sebuah nilai 128-bit, jadi jika Anda menginginkan yang acak:

import random

hash = random.getrandbits(128)

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

Saya tidak begitu mengerti maksudnya. Mungkin Anda harus menjelaskan mengapa Anda membutuhkan ini ...

sth
sumber
1 untuk tidak menghitung hash yang relatif mahal dari bilangan acak: pendekatan ini 5x lebih cepat.
Nicolas Dumazet
11
+1 - pasti ini lebih baik dari jawaban saya, bisa digunakan juga seperti ini: hex (random.getrandbits (128)) [2: -1] ini memberi Anda keluaran yang sama dengan metode hexdigest md5.
Jiri
1
panggilan random.seed () tidak berguna, lebih atau kurang.
tzot
2
Saya akan menggunakan os.urandom karena menginginkan hash MD5 mungkin berarti menginginkan yang aman.
Tidak diketahui
9
Berikut cara melakukannya dengan os.urandom:''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird
97

Saya pikir apa yang Anda cari adalah pengenal unik universal. Lalu modul UUID di python adalah apa yang Anda cari.

import uuid
uuid.uuid4().hex

UUID4 memberi Anda pengenal unik acak yang memiliki panjang yang sama dengan jumlah md5. Hex akan mewakili adalah sebagai string hex alih-alih mengembalikan objek uuid.

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

sebs
sumber
44

Ini berfungsi untuk python 2.x dan 3.x

import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
Kancing 840
sumber
2
Cara pengkodean heksadesimal ini tidak lagi berfungsi di Python 3.
Caramdir
1
Terima kasih. ini adalah cara terbaik untuk membuat kunci hash acak.
Jake
7
bekerja untuk 2.x dan 3.x: binascii.hexlify (os.urandom (16))
Clay
44

The secretsModul ditambahkan dengan Python 3.6+. Ini memberikan nilai acak yang aman secara kriptografis dengan satu panggilan. Fungsi mengambil nbytesargumen opsional , default adalah 32 (byte * 8 bit = token 256-bit). MD5 memiliki hash 128-bit, jadi berikan 16 untuk token "seperti 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.
sumber
19

Namun pendekatan lain. Anda tidak perlu memformat int untuk mendapatkannya.

import random
import string

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

Memberi Anda fleksibilitas pada panjang senar.

>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'
Matthew Taylor
sumber
Saya mungkin akan mengubah string.letters menjadi 'abcdf' untuk mencerminkan digit heksadesimal. Tapi solusi yang bagus!
Peternakan
''.join(random.sample(string.ascii_letters + string.digits, 8))lebih pythonic?
404pio
6

Pendekatan lain untuk pertanyaan khusus ini:

import random, string

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

Saya tidak mengatakan itu lebih cepat atau lebih disukai daripada jawaban lain; hanya saja itu pendekatan lain :)

tzot.dll
sumber
5
import uuid
from md5 import md5

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

Juga harus dicatat bahwa MD5 adalah fungsi hash yang sangat lemah, juga tabrakan telah ditemukan (dua nilai teks biasa yang berbeda menghasilkan hash yang sama) Cukup gunakan nilai acak untuk plaintext.

Eric Jin
sumber
Meminta masukan pengguna tidak membantu dengan aspek "termudah" dari pertanyaan asli ...
AS Mackay
Apakah Anda sudah memeriksa kode Anda? Tidak ada paren di baris 3.
sini