Випадковий хеш в Python


100

Який найпростіший спосіб генерувати випадковий хеш (MD5) у Python?


1
Випадково як для чого? Або для об’єкта? Якщо ви просто хочете випадковий MD5, просто виберіть кілька цифр.
samoz

Я перейменую файли перед завантаженням і хочу назви файлу, як це: timestamp_randommd5.extension Будьте здорові!
mistero

5
Ви можете просто перейменувати їх у timestamp_randomnumber.ext. Дійсно не існує причини, чому md5 (randomnumber) буде кращим, ніж сам випадковий номер.
sth

Найкращою відповіддю на Python 3 є останнім import uuid; uuid.uuid().hex stackoverflow.com/a/20060712/3218806
maxbellec

Відповіді:


131

Md5-хеш - це лише 128-бітове значення, тому якщо ви хочете випадковий:

import random

hash = random.getrandbits(128)

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

Я не бачу сенсу, хоча. Можливо, вам варто розібратися, навіщо вам це потрібно ...


+1 за не обчислення відносно дорогого хешу з випадкового числа: такий підхід у 5 разів швидший.
Ніколя Думазет

11
+1 - безумовно, це краще, ніж моя відповідь, можна використовувати також так: hex (random.getrandbits (128)) [2: -1], це дає такий же вихід, як і md5 hexdigest метод.
Іржі

1
виклик random.seed () марний, більш-менш.
tzot

2
Я б використав os.urandom, тому що бажати хешу MD5 може означати, що потрібно захистити його.
Невідомо

9
Ось як це зробити os.urandom:''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird

97

Я думаю, що ви шукаєте, це універсальний унікальний ідентифікатор. Потім модуль UUID в python - це те, що ви шукаєте.

import uuid
uuid.uuid4().hex

UUID4 дає вам випадковий унікальний ідентифікатор, який має ту саму довжину, що й сума md5. Hex буде представляти собою шістнадцятковий рядок замість повернення 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.
Карамдір

1
Дякую. це найкращий спосіб зробити випадковий хеш-ключ.
Джейк

7
працює для 2.x та 3.x: binascii.hexlify (os.urandom (16))
Глина

44

secretsМодуль був доданий в Python 3.6 +. Він забезпечує криптографічно захищені випадкові значення за допомогою одного виклику. Функції приймають необов'язковий nbytesаргумент, за замовчуванням - 32 (байт * 8 біт = 256-бітових лексем). У MD5 є 128-бітні хеші, тому надайте 16 для маркерів "подібних до MD5".

>>> 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' для відображення шістнадцяткових цифр. Але чудове рішення!
ранчалп

''.join(random.sample(string.ascii_letters + string.digits, 8))більше пітонічний?
404піо

6

Ще один підхід до цього конкретного питання:

import random, string

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

Я не кажу, що це швидше або краще будь-якій іншій відповіді; тільки що це інший підхід :)




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.


Потрібні введення користувачем не допомагають з "найпростішим" аспектом оригінального питання ...
А.С. Макей

Ви перевірили свій код? У ньому відсутній
батько
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.