Random hash in Python

PythonHashMd5

Python Problem Overview


What is the easiest way to generate a random hash (MD5) in Python?

Python Solutions


Solution 1 - Python

A md5-hash is just a 128-bit value, so if you want a random one:

import random

hash = random.getrandbits(128)

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

I don't really see the point, though. Maybe you should elaborate why you need this...

Solution 2 - Python

I think what you are looking for is a universal unique identifier.Then the module UUID in python is what you are looking for.

import uuid
uuid.uuid4().hex

UUID4 gives you a random unique identifier that has the same length as a md5 sum. Hex will represent is as an hex string instead of returning a uuid object.

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

Solution 3 - Python

The secrets module was added in Python 3.6+. It provides cryptographically secure random values with a single call. The functions take an optional nbytes argument, default is 32 (bytes * 8 bits = 256-bit tokens). MD5 has 128-bit hashes, so provide 16 for "MD5-like" tokens.

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

Solution 4 - Python

This works for both python 2.x and 3.x

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

Solution 5 - Python

Yet another approach. You won't have to format an int to get it.

import random
import string

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

Gives you flexibility on the length of the string.

>>> random_string(64)
'XTgDkdxHK7seEbNDDUim9gUBFiheRLRgg7HyP18j6BZU5Sa7AXiCHP1NEIxuL2s0'

Solution 6 - Python

Another approach to this specific question:

import random, string

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

I'm not saying it's faster or preferable to any other answer; just that it's another approach :)

Solution 7 - Python

import uuid
from md5 import md5

print md5(str(uuid.uuid4())).hexdigest()

Solution 8 - Python

import os, hashlib
hashlib.md5(os.urandom(32)).hexdigest()

Solution 9 - Python

The most proper way is to use random module

import random
format(random.getrandbits(128), 'x')

Using secrets is an overkill. It generates cryptographically strong randomness sacrifying performance.

All responses that suggest using UUID are intrinsically wrong because UUID (even UUID4) are not totally random. At least they include fixed version number that never changes.

import uuid
>>> uuid.uuid4()
UUID('8a107d39-bb30-4843-8607-ce9e480c8339')
>>> uuid.uuid4()
UUID('4ed324e8-08f9-4ea5-bc0c-8a9ad53e2df6')

All MD5s containing something other than 4 at 13th position from the left will be unreachable this way.

Solution 10 - Python


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)

It should also be noted that MD5 is a very weak hash function, also collisions have been found (two different plaintext values result in the same hash) Just use a random value for plaintext.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmisteroView Question on Stackoverflow
Solution 1 - PythonsthView Answer on Stackoverflow
Solution 2 - PythonsebsView Answer on Stackoverflow
Solution 3 - PythonNick TView Answer on Stackoverflow
Solution 4 - PythonButtons840View Answer on Stackoverflow
Solution 5 - PythonMatthew TaylorView Answer on Stackoverflow
Solution 6 - PythontzotView Answer on Stackoverflow
Solution 7 - PythonSamView Answer on Stackoverflow
Solution 8 - PythongizzmoleView Answer on Stackoverflow
Solution 9 - PythonPasha PodolskyView Answer on Stackoverflow
Solution 10 - PythonEric JinView Answer on Stackoverflow