Python'da rastgele hash


101

Python'da rastgele bir hash (MD5) oluşturmanın en kolay yolu nedir ?


1
Herhangi bir şey için olduğu gibi rastgele mi? Veya bir nesne için? Sadece rastgele bir MD5 istiyorsanız, sadece birkaç sayı seçin.
samoz

Dosyaları yüklemeden önce yeniden adlandırıyorum ve şöyle bir dosya adı istiyorum: timestamp_randommd5.extension Şerefe!
mistero

5
Bunları timestamp_randomnumber.ext olarak yeniden adlandırabilirsiniz. Gerçekten md5'in (rastgele sayı) rastgele sayının kendisinden daha iyi olmasının bir nedeni yok.
STH

Python 3 için en iyi cevap, sonuncu import uuid; uuid.uuid().hex stackoverflow.com/a/20060712/3218806
maxbellec

Yanıtlar:


131

Bir md5 hash değeri yalnızca 128 bitlik bir değerdir, bu nedenle rastgele bir tane istiyorsanız:

import random

hash = random.getrandbits(128)

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

Yine de asıl noktayı görmüyorum. Belki de buna neden ihtiyacın olduğunu açıklamalısın ...


Rastgele bir sayıdan nispeten pahalı bir hash hesaplamamak için +1: bu yaklaşım 5 kat daha hızlıdır.
Nicolas Dumazet

11
+1 - elbette bu benim cevabımdan daha iyidir, şu şekilde de kullanılabilir: hex (random.getrandbits (128)) [2: -1] bu size md5 hexdigest yöntemiyle aynı çıktıyı verir.
Jiri

1
random.seed () çağrısı az ya da çok işe yaramaz.
tzot

2
Os.urandom'u kullanırdım çünkü bir MD5 hash'ı istemek güvenli bir tane istemek anlamına gelebilir.
Unknown

9
Bunu şu şekilde yapabilirsiniz os.urandom:''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird

100

Sanırım aradığınız evrensel benzersiz bir tanımlayıcı. Python'daki UUID modülü aradığınız şeydir.

import uuid
uuid.uuid4().hex

UUID4, md5 toplamı ile aynı uzunluğa sahip rastgele benzersiz bir tanımlayıcı verir. Hex, bir uuid nesnesi döndürmek yerine onaltılık bir dizedir.

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


44

Bu hem python 2.x hem de 3.x için çalışır

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

2
Bu onaltılık kodlama yöntemi artık Python 3'te çalışmıyor.
Caramdir

1
Teşekkürler. bu, rastgele bir karma anahtar oluşturmanın en iyi yoludur.
Jake,

7
2.x ve 3.x için çalışıyor: binascii.hexlify (os.urandom (16))
Clay

44

secretsModül Python 3.6+ yılında eklenmiştir. Tek bir çağrı ile kriptografik olarak güvenli rasgele değerler sağlar. Fonksiyonlar isteğe bağlı bir nbytesargüman alır, varsayılan 32'dir (bayt * 8 bit = 256 bit belirteç). MD5, 128 bitlik karmalara sahiptir, bu nedenle "MD5 benzeri" simgeler için 16 sağlayın.

>>> 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

Yine başka bir yaklaşım. Bir int'i elde etmek için biçimlendirmeniz gerekmeyecek.

import random
import string

def random_string(length):
    pool = string.letters + string.digits
    return ''.join(random.choice(pool) for i in xrange(length))

İpin uzunluğu konusunda size esneklik sağlar.

>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'

Onaltılık basamakları yansıtmak için muhtemelen string.letters'ı 'abcdf' olarak değiştirirdim. Ama harika bir çözüm!
ranchalp

''.join(random.sample(string.ascii_letters + string.digits, 8))daha pitonik?
404pio

6

Bu özel soruya başka bir yaklaşım:

import random, string

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

Başka bir cevaba göre daha hızlı ya da tercih edilir demiyorum; sadece başka bir yaklaşım :)


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'in çok zayıf bir hash fonksiyonu olduğu da unutulmamalıdır, ayrıca çarpışmalar da bulunmuştur (iki farklı düz metin değeri aynı hash ile sonuçlanır) Sadece için rastgele bir değer kullanın plaintext.


Kullanıcı girişi gerektirmek, orijinal sorunun "en kolay" yönüne yardımcı olmaz ...
AS Mackay

Kodunuzu kontrol ettiniz mi? 3. satırda bir
parantez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.