Hàm băm ngẫu nhiên trong Python


100

Là gì đơn giản nhất cách để tạo ra một hash ngẫu nhiên (MD5) bằng Python?


1
Ngẫu nhiên như trong cho bất cứ điều gì? Hay cho một đối tượng? Nếu bạn chỉ muốn một MD5 ngẫu nhiên, chỉ cần chọn một số số.
samoz

Tôi đang đổi tên tệp trước khi tải lên và muốn có tên tệp như sau: timestamp_randommd5.extension Chúc mừng!
mistero

5
Bạn chỉ có thể đổi tên chúng thành timestamp_randomnumber.ext. Thực sự không có lý do tại sao md5 (số ngẫu nhiên) sẽ tốt hơn bất kỳ số ngẫu nhiên nào.
sth

Câu trả lời tốt nhất cho Python 3 là người cuối cùng import uuid; uuid.uuid().hex stackoverflow.com/a/20060712/3218806
maxbellec

Câu trả lời:


131

Md5-hash chỉ là một giá trị 128-bit, vì vậy nếu bạn muốn một giá trị ngẫu nhiên:

import random

hash = random.getrandbits(128)

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

Tuy nhiên, tôi không thực sự thấy vấn đề. Có lẽ bạn nên giải thích lý do tại sao bạn cần điều này ...


+1 vì không tính toán một hàm băm tương đối đắt tiền từ một số ngẫu nhiên: cách tiếp cận này nhanh hơn gấp 5 lần.
Nicolas Dumazet

11
+1 - chắc chắn điều này tốt hơn câu trả lời của tôi, cũng có thể được sử dụng như thế này: hex (random.getrandbits (128)) [2: -1] điều này cung cấp cho bạn kết quả tương tự như phương pháp md5 hexdigest.
Jiri

1
lệnh gọi random.seed () dù ít hay nhiều cũng vô ích.
tzot

2
Tôi đã sử dụng os.urandom vì muốn băm MD5 có thể có nghĩa là muốn một an toàn.
Không xác định

9
Dưới đây là làm thế nào để làm điều đó với os.urandom:''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird

97

Tôi nghĩ rằng những gì bạn đang tìm kiếm là một mã định danh duy nhất phổ quát. Vì vậy, UUID của mô-đun trong python chính là thứ bạn đang tìm kiếm.

import uuid
uuid.uuid4().hex

UUID4 cung cấp cho bạn một số nhận dạng duy nhất ngẫu nhiên có cùng độ dài với tổng md5. Hex sẽ đại diện là một chuỗi hex thay vì trả về một đối tượng uuid.

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


44

Điều này hoạt động cho cả python 2.x và 3.x

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

2
Cách mã hóa thập lục phân này không hoạt động trong Python 3 nữa.
Caramdir

1
cảm ơn. đây là cách tốt nhất để tạo một khóa băm ngẫu nhiên.
Jake

7
hoạt động cho 2.x và 3.x: binascii.hexlify (os.urandom (16))
Clay

44

Các secretsmô-đun đã được bổ sung bằng Python 3.6+. Nó cung cấp các giá trị ngẫu nhiên an toàn bằng mật mã chỉ với một lệnh gọi. Các hàm lấy một nbytesđối số tùy chọn , mặc định là 32 (byte * 8 bit = mã thông báo 256 bit). MD5 có mã băm 128 bit, vì vậy hãy cung cấp 16 cho mã thông báo "giống 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

Tuy nhiên, một cách tiếp cận khác. Bạn sẽ không phải định dạng int để lấy nó.

import random
import string

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

Giúp bạn linh hoạt về độ dài của chuỗi.

>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'

Tôi có thể sẽ thay đổi string.letters thành 'abcdf' để phản ánh các chữ số thập lục phân. Nhưng giải pháp tuyệt vời!
ranchalp

''.join(random.sample(string.ascii_letters + string.digits, 8))nhiều trăn?
404pio

6

Một cách tiếp cận khác cho câu hỏi cụ thể này:

import random, string

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

Tôi không nói nó nhanh hơn hay thích hợp hơn bất kỳ câu trả lời nào khác; chỉ là đó là một cách tiếp cận khác :)


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)

Cũng cần lưu ý rằng MD5 là một hàm băm rất yếu, cũng đã tìm thấy xung đột (hai giá trị bản rõ khác nhau dẫn đến cùng một hàm băm) Chỉ cần sử dụng một giá trị ngẫu nhiên cho plaintext.


Yêu cầu đầu vào của người dùng không giúp ích gì cho khía cạnh "dễ nhất" của câu hỏi ban đầu ...
AS Mackay

Bạn đã kiểm tra mã của mình chưa? Nó thiếu dấu ngoặc ở dòng 3.
ingyhere
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.