在Python中生成随机哈希(MD5)的最简单方法是什么?
import random
hash = random.getrandbits(128)
print("hash value: %032x" % hash)
os.urandom
生成随机字节串并转换为十六进制字符串的方法是:''.join('%02x' % ord(x) for x in os.urandom(16))
。 - FogleBird我认为您正在寻找的是通用唯一标识符。那么,在Python中,UUID模块就是您要寻找的。
import uuid
uuid.uuid4().hex
UUID4可以为您提供一个随机的唯一标识符,其长度与md5校验和相同。使用十六进制字符串表示它,而不是返回uuid对象。
secrets
模块 是从 Python 3.6+ 开始引入的。它通过一个单一的调用提供了密码安全的随机值。这些函数接受一个可选参数 nbytes
,默认参数为 32(字节 * 8 位 = 256 位令牌)。MD5 具有 128 位哈希值,因此为“MD5 类型”令牌提供 16。
>>> 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'
这适用于 Python 2.x 和 3.x
import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
另一种方法。您无需格式化整数即可获得它。
import random
import string
def random_string(length):
pool = string.letters + string.digits
return ''.join(random.choice(pool) for i in xrange(length))
让字符串长度更加灵活。
>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'
''.join(random.sample(string.ascii_letters + string.digits, 8))
? - 404piostring.ascii_letters
for python 3 instead of string.letters
- Alex针对这个具体问题的另一种方法:
import random, string
def random_md5like_hash():
available_chars= string.hexdigits[:16]
return ''.join(
random.choice(available_chars)
for dummy in xrange(32))
我并不是说这是比其他答案更快或更可取的解决方案;只是它是另一种方法 :)
import uuid
from md5 import md5
print md5(str(uuid.uuid4())).hexdigest()
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()
eca224d7443ec56efd984c08904cbe4b
- not2qubitrandom
模块。import random
format(random.getrandbits(128), 'x')
使用secrets
是过度的。它会牺牲性能,生成具有密码学强度的随机数。
所有建议使用UUID的响应在本质上都是错误的,因为UUID(甚至是UUID4)并不是完全随机的。至少它们包含一个永远不会改变的固定版本号。
import uuid
>>> uuid.uuid4()
UUID('8a107d39-bb30-4843-8607-ce9e480c8339')
>>> uuid.uuid4()
UUID('4ed324e8-08f9-4ea5-bc0c-8a9ad53e2df6')
所有MD5哈希值中,从左数第13位不是4
的将无法通过此方式访问。
os.urandom(128//8)
计算时间比普通方式长 5 倍,或者长出 0.25 微秒。如果你关心在生成 400 万个哈希时节省 1 秒的时间,你应该使用像 PCG 这样更快的 RNG。如果你认为你的“哈希”是不可预测的,那么你应该使用 CSPRNG,因为在使用该函数约 160 次后,重新构建 RNG 状态(https://github.com/eboda/mersenne-twister-recover)是非常容易的。 - Nick T4
,这是一个问题。 - Pasha Podolsky
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)
plaintext
使用随机值即可。
import uuid; uuid.uuid().hex
https://dev59.com/h3NA5IYBdhLWcg3wZ8_U#20060712 - maxbellec