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

101

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

мистеро
источник
1
Случайно как в чем-нибудь? Или для объекта? Если вам просто нужен случайный MD5, просто выберите несколько чисел.
samoz
Я переименовываю файлы перед загрузкой и хочу, чтобы имя файла было таким: timestamp_randommd5.extension Ура!
mistero
5
Вы можете просто переименовать их в timestamp_randomnumber.ext. На самом деле нет причины, по которой md5 (randomnumber) было бы лучше, чем само randomnumber.
чт,
лучший ответ для 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 раз быстрее.
Николас Дюмазе
11
+1 - конечно, это лучше, чем мой ответ, можно использовать и так: hex (random.getrandbits (128)) [2: -1] это дает тот же результат, что и метод md5 hexdigest.
Jiri
1
вызов random.seed () более или менее бесполезен.
tzot
2
Я бы использовал os.urandom, потому что хеширование MD5 может означать потребность в безопасном.
Неизвестный,
9
Вот как это сделать os.urandom:''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird
101

Я думаю, что вы ищете универсальный уникальный идентификатор. Тогда 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'
Кнопки840
источник
2
Этот способ шестнадцатеричного кодирования больше не работает в Python 3.
Caramdir
1
Спасибо. это лучший способ сделать случайный хеш-ключ.
Джейк
7
работает для 2.x и 3.x: binascii.hexlify (os.urandom (16))
Clay
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, чтобы отразить шестнадцатеричные цифры. Но отличное решение!
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 отсутствует
парен.