Hash acak dengan Python


100

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


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


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


44

Ini berfungsi untuk python 2.x dan 3.x

import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'

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'

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'

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


5
import uuid
from md5 import md5

print md5(str(uuid.uuid4())).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)

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.