121

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

4

9 回答 9

159

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

import random

hash = random.getrandbits(128)

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

不过,我真的不明白这一点。也许你应该详细说明为什么你需要这个......

于 2009-06-10T16:09:12.907 回答
129

我认为你正在寻找的是一个通用的唯一标识符。那么 python 中的模块 UUID 就是你正在寻找的。

import uuid
uuid.uuid4().hex

UUID4 为您提供一个随机唯一标识符,其长度与 md5 总和相同。Hex 将 is 表示为一个十六进制字符串,而不是返回一个 uuid 对象。

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

于 2013-11-19T00:18:52.963 回答
69

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'
于 2017-07-17T22:36:43.630 回答
48

这适用于 python 2.x 和 3.x

import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
于 2012-03-22T04:19:41.753 回答
23

还有另一种方法。您不必格式化 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'
于 2012-01-25T22:10:22.510 回答
6

这个特定问题的另一种方法:

import random, string

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

我并不是说它比任何其他答案更快或更可取;只是这是另一种方法:)

于 2009-06-11T22:52:23.097 回答
6
import uuid
from md5 import md5

print md5(str(uuid.uuid4())).hexdigest()
于 2013-07-26T18:03:28.763 回答
4
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()
于 2017-05-30T23:44:15.567 回答
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)

还需要注意的是,MD5 是一个非常弱的散列函数,也发现了冲突(两个不同的明文值导致相同的散列)只需对plaintext.

于 2019-02-24T19:23:14.803 回答