Случайный хеш в Python - PullRequest
       34

Случайный хеш в Python

79 голосов
/ 10 июня 2009

Каков самый простой способ генерирования случайного хэша (MD5) в Python?

Ответы [ 9 ]

115 голосов
/ 10 июня 2009

Хэш md5 - это просто 128-битное значение, поэтому, если вы хотите случайное:

import random

hash = random.getrandbits(128)

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

Хотя я не вижу в этом смысла. Может, тебе стоит уточнить, зачем тебе это ...

73 голосов
/ 19 ноября 2013

Я думаю, что вы ищете универсальный уникальный идентификатор. Тогда модуль UUID в python - это то, что вы ищете.

import uuid
uuid.uuid4().hex

UUID4 дает вам случайный уникальный идентификатор, длина которого равна сумме md5. Hex будет представлять собой шестнадцатеричную строку вместо возврата объекта uuid.

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

43 голосов
/ 22 марта 2012

Это работает как для Python 2.x, так и для 3.x

import os
import binascii
print(binascii.hexlify(os.urandom(16)))
'4a4d443679ed46f7514ad6dbe3733c3d'
26 голосов
/ 18 июля 2017

Модуль 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'
14 голосов
/ 26 января 2012

Еще один подход. Вам не нужно будет форматировать 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'
6 голосов
/ 12 июня 2009

Другой подход к этому конкретному вопросу:

import random, string

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

Я не говорю, что это быстрее или предпочтительнее любого другого ответа; просто это другой подход:)

5 голосов
/ 26 июля 2013
import uuid
from md5 import md5

print md5(str(uuid.uuid4())).hexdigest()
2 голосов
/ 31 мая 2017
import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()
0 голосов
/ 24 февраля 2019
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.

...