Python中的随机哈希

Posted

技术标签:

【中文标题】Python中的随机哈希【英文标题】:Random hash in Python 【发布时间】:2010-11-01 20:55:51 【问题描述】:

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

【问题讨论】:

随机什么的?还是为了一个对象?如果您只想要一个随机的 MD5,只需选择一些数字即可。 我正在重命名文件,然后再上传并想要这样的文件名:timestamp_randomd5.extension 干杯! 您可以将它们重命名为 timestamp_randomnumber.ext。 md5(randomnumber) 确实没有理由比 randomnumber 本身更好。 Python 3 的最佳答案是最后一个 import uuid; uuid.uuid().hex ***.com/a/20060712/3218806 【参考方案1】:

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

import random

hash = random.getrandbits(128)

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

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

【讨论】:

+1 用于不从随机数计算相对昂贵的哈希:这种方法快 5 倍。 +1 - 这肯定比我的回答要好,也可以这样使用: hex(random.getrandbits(128))[2:-1] 这为您提供与 md5 hexdigest 方法相同的输出. random.seed() 调用或多或少没用。 我会使用 os.urandom 因为想要一个 MD5 哈希可能意味着想要一个安全的。 这里是使用os.urandom的方法:''.join('%02x' % ord(x) for x in os.urandom(16))【参考方案2】:

我认为你要找的是一个通用的唯一标识符。那么python中的模块UUID就是你要找的。​​p>

import uuid
uuid.uuid4().hex

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

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

【讨论】:

【参考方案3】:

secrets module 是在 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'

【讨论】:

【参考方案4】:

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

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

【讨论】:

这种十六进制编码方式不再适用于 Python 3。 谢谢。这是制作随机散列密钥的最佳方式。 适用于 2.x 和 3.x:binascii.hexlify(os.urandom(16))【参考方案5】:

另一种方法。您无需格式化 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'

【讨论】:

我可能会将 string.letters 更改为 'abcdf' 以反映十六进制数字。但是很好的解决方案! ''.join(random.sample(string.ascii_letters + string.digits, 8)) 更多pythonic? string.ascii_letters 用于 python 3 而不是 string.letters【参考方案6】:

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

import random, string

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

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

【讨论】:

【参考方案7】:
import uuid
from md5 import md5

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

【讨论】:

【参考方案8】:
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()

【讨论】:

【参考方案9】:

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 使用随机值。

【讨论】:

要求用户输入无助于原始问题的“最简单”方面... 你检查你的代码了吗?它在第 3 行缺少一个括号。

以上是关于Python中的随机哈希的主要内容,如果未能解决你的问题,请参考以下文章

python 中关于字典的键

如何生成随机 SHA1 哈希以用作 node.js 中的 ID?

python Python的随机哈希生成器

LeetCode 458. 可怜的小猪(找毒药问题) / 700. 二叉搜索树中的搜索 / 519. 随机翻转矩阵(哈希表记录交换位置)

python Python中的一致哈希实现。

python Python中的一致哈希实现。