Pythonのランダムハッシュ


100

Pythonでランダムハッシュ(MD5)を生成する最も簡単な方法は何ですか?


1
何かのようにランダム?またはオブジェクトについては?ランダムなMD5が必要な場合は、いくつかの数字を選択してください。
samoz、2009年

アップロードする前にファイル名を変更していて、timestamp_randommd5.extension Cheers!
ミステロ09/10/06

5
それらの名前をtimestamp_randomnumber.extに変更するだけです。md5(randomnumber)がrandomnumber自体よりも優れている理由は実際にはありません。
STH

Pythonの3のための最良の答えは最後のものであるimport uuid; uuid.uuid().hex stackoverflow.com/a/20060712/3218806
maxbellec

回答:


131

md5-hashは128ビットの値なので、ランダムな値が必要な場合は、次のようにします。

import random

hash = random.getrandbits(128)

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

でも、要点はわかりません。多分あなたはなぜこれが必要なのかを詳しく説明する必要があります...


+1は、乱数から比較的高価なハッシュを計算しないためです。このアプローチは5倍高速です。
Nicolas Dumazet 09年

11
+1-これは確かに私の答えよりも優れており、次のように使用することもできます:hex(random.getrandbits(128))[2:-1]これにより、md5 hexdigestメソッドと同じ出力が得られます。
Jiri、

1
random.seed()呼び出しは、多かれ少なかれ役に立たない。
tzot 2009年

2
MD5ハッシュが必要な場合は、安全なハッシュが必要な場合があるため、os.urandomを使用しました。
不明

9
ここでそれを行う方法ですos.urandom''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird

97

あなたが探しているのは普遍的な一意の識別子だと思います。次に、PythonのモジュールUUIDが探しているものです。

import uuid
uuid.uuid4().hex

UUID4は、md5合計と同じ長さのランダムな一意の識別子を提供します。16進数は、uuidオブジェクトを返すのではなく、16進数の文字列として表します。

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
この16進エンコーディングの方法は、Python 3では機能しなくなりました。
Caramdir 2013

1
ありがとう。これはランダムなハッシュキーを作成する最良の方法です。
Jake

7
2.xと3.xで機能します:binascii.hexlify(os.urandom(16))
クレイ

44

secretsモジュールは Pythonの3.6以降で追加されました。1回の呼び出しで、暗号で保護されたランダムな値を提供します。関数はオプションの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'

16進数を反映するために、おそらく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()


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は非常に弱いハッシュ関数であり、衝突も検出されていることにも注意してください(2つの異なる平文値が同じハッシュになる)にはランダムな値を使用してくださいplaintext


ユーザー入力を要求することは、元の質問の「最も簡単な」側面には役立ちません...
AS Mackay

コードを確認しましたか?これは、3行目に括弧が欠落しています
ingyhere
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.