Apa cara termudah untuk menghasilkan hash acak (MD5) dengan Python?
import uuid; uuid.uuid().hex
stackoverflow.com/a/20060712/3218806
Apa cara termudah untuk menghasilkan hash acak (MD5) dengan Python?
import uuid; uuid.uuid().hex
stackoverflow.com/a/20060712/3218806
Jawaban:
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 ...
os.urandom
:''.join('%02x' % ord(x) for x in os.urandom(16))
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.
Ini berfungsi untuk python 2.x dan 3.x
import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
The secrets
Modul ditambahkan dengan Python 3.6+. Ini memberikan nilai acak yang aman secara kriptografis dengan satu panggilan. Fungsi mengambil nbytes
argumen 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'
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'
''.join(random.sample(string.ascii_letters + string.digits, 8))
lebih pythonic?
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 :)
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()
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
.