Python의 임의 해시


100

Python에서 임의 해시 (MD5)를 생성하는 가장 쉬운 방법 은 무엇입니까 ?


1
뭐든지 무작위로? 아니면 물건을 위해? 임의의 MD5를 원하면 숫자를 선택하십시오.
samoz

업로드하기 전에 파일 이름을 바꾸고 있으며 다음과 같은 파일 이름을 원합니다. timestamp_randommd5.extension Cheers!
mistero

5
timestamp_randomnumber.ext로 이름을 바꿀 수 있습니다. md5 (randomnumber)가 난수 자체보다 나은 이유는 없습니다.
sth

파이썬 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

11
+1-확실히 이것은 내 대답보다 낫습니다. 다음과 같이 사용할 수도 있습니다. hex (random.getrandbits (128)) [2 : -1] 이것은 md5 hexdigest 메서드와 동일한 출력을 제공합니다.
Jiri

1
random.seed () 호출은 다소 쓸모가 없습니다.
tzot

2
MD5 해시를 원한다는 것은 안전한 해시를 원할 수 있기 때문에 os.urandom을 사용했을 것입니다.
Unknown

9
방법은 다음과 os.urandom같습니다.''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird 2011-08-29

97

나는 당신이 찾고있는 것이 보편적 인 고유 식별자라고 생각합니다. 그러면 파이썬의 모듈 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
감사. 이것은 임의의 해시 키를 만드는 가장 좋은 방법입니다.
제이크

7
2.x 및 3.x를위한 작품 : binascii.hexlify (os.urandom (16))
클레이

44

secrets모듈은 파이썬 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'

16 진수를 반영하기 위해 string.letters를 'abcdf'로 변경합니다. 그러나 훌륭한 솔루션!
ranchalp

''.join(random.sample(string.ascii_letters + string.digits, 8))더 비단뱀?
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.


사용자 입력을 요구하는 것은 원래 질문의 "가장 쉬운"측면에 도움이되지 않습니다 ...
AS Mackay

코드를 확인 했습니까? 3 행에 괄호가 없습니다.
ingyhere
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.