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中的随机哈希的主要内容,如果未能解决你的问题,请参考以下文章
如何生成随机 SHA1 哈希以用作 node.js 中的 ID?
LeetCode 458. 可怜的小猪(找毒药问题) / 700. 二叉搜索树中的搜索 / 519. 随机翻转矩阵(哈希表记录交换位置)