Python 中的随机散列

在 Python 中生成随机散列(MD5)的 最简单的方法是什么?

126846 次浏览

Md5-hash 只是一个128位的值,所以如果你想要一个随机值:

import random


hash = random.getrandbits(128)


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

我不明白这有什么意义,也许你应该解释一下为什么你需要这个..。

对这一具体问题的另一种解决办法是:

import random, string


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

我并不是说它比其他任何答案都更快或更好,只是说它是 另一个方法:)

还有另一种方法,不需要格式化 int 就可以得到它。

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'

这对 python2.x 和3.x 都适用

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


print md5(str(uuid.uuid4())).hexdigest()

我觉得你要找的是一个通用的唯一标识符。那么 python 中的模块 UUID 就是您要寻找的。

import uuid
uuid.uuid4().hex

UUID4给你一个与 md5和长度相同的随机唯一标识符。十六进制将表示为十六进制字符串,而不是返回 uuid 对象。

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

Https://docs.python.org/3/library/uuid.html

import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()

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'

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)

还应该指出的是,MD5是一个非常弱的散列函数,也发现了冲突(两个不同的明文值导致相同的散列) 只需为 plaintext使用一个随机值。

最恰当的方法是使用 random模块

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包含的东西以外的 4在第13位置从左边将无法达到这种方式。