Python中的随机哈希


100

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


1
随便什么?还是一个对象?如果您只想要一个随机的MD5,请选择一些数字。
samoz

我在上传之前重命名文件,并想要一个这样的文件名:timestamp_randommd5.extension干杯!
mistero 2009年

5
您可以将它们重命名为timestamp_randomnumber.ext。确实没有理由说md5(randomnumber)会比randomnumber本身更好。
某事

Python 3的最佳答案是最后一个import uuid; uuid.uuid().hex stackoverflow.com/a/20060712/3218806
maxbellec '16

Answers:


131

md5-hash只是一个128位的值,因此如果您想要一个随机的值:

import random

hash = random.getrandbits(128)

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

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


+1表示不根据随机数计算相对昂贵的哈希值:这种方法快5倍。
Nicolas Dumazet,2009年

11
+1-当然,这比我的回答要好,也可以像这样使用:hex(random.getrandbits(128))[2:-1]这与md5 hexdigest方法的输出相同。
吉里(Jiri)

1
random.seed()调用或多或少是无用的。
tzot

2
我会使用os.urandom,因为想要MD5哈希可能意味着想要一个安全的哈希。
未知

9
使用以下方法的方法os.urandom如下:''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird 2011年

97

我认为您正在寻找的是通用唯一标识符。然后python中的模块UUID就是您正在寻找的东西。

import uuid
uuid.uuid4().hex

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

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


44

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

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

2
这种十六进制编码方式在Python 3中不再起作用。
Caramdir

1
谢谢。这是制作随机哈希密钥的最佳方法。
2014年

7
适用于2.x和3.x:binascii.hexlify(os.urandom(16))
Clay

44

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'

19

还有另一种方法。您无需格式化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'以反映十六进制数字。但是很好的解决方案!
ranchalp

''.join(random.sample(string.ascii_letters + string.digits, 8))更多pythonic吗?
404pio

6

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

import random, string

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

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


5
import uuid
from md5 import md5

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

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

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


要求用户输入无助于原始问题的“最简单”方面……
Mackay

您是否检查过代码?它缺少第3行的
括号。– ingyhere
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.