पायथन में रैंडम हैश


100

पायथन में एक यादृच्छिक हैश (MD5) उत्पन्न करने का सबसे आसान तरीका क्या है ?


1
कुछ के लिए के रूप में यादृच्छिक? या किसी वस्तु के लिए? यदि आप बस एक यादृच्छिक MD5 चाहते हैं, तो बस कुछ नंबर चुनें।
समोसे

मैं अपलोड करने से पहले फ़ाइलों का नाम बदल रहा हूं और इस तरह एक फ़ाइल नाम चाहता हूं: timestamp_randommd5.extension चीयर्स!
मिस्टरो

5
आप बस उन्हें टाइमस्टैम्प_randomnumber.ext का नाम बदल सकते हैं। वहाँ वास्तव में एक कारण नहीं है क्यों md5 (randomnumber) randomnumber की तुलना में किसी भी बेहतर होगा।
sth

अजगर 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: यह दृष्टिकोण 5x तेज है।
निकोलस डुमाज़ेट

11
+1 - निश्चित रूप से यह मेरे उत्तर से बेहतर है, इसका उपयोग इस तरह भी किया जा सकता है: हेक्स (random.getrandbits (128)) [2: -1] यह आपको md5 हेक्सिडिगेस्ट विधि के समान आउटपुट देता है।
गिरि

1
random.seed () कॉल बेकार है, कम या ज्यादा।
tzot 22:11

2
मैंने os.urandom का उपयोग किया होगा, क्योंकि MD5 हैश चाहने का मतलब सुरक्षित होना चाह सकता है।
अज्ञात

9
यहां बताया गया है कि इसे कैसे करें os.urandom:''.join('%02x' % ord(x) for x in os.urandom(16))
FogleBird

97

मुझे लगता है कि आप जो देख रहे हैं वह एक सार्वभौमिक विशिष्ट पहचानकर्ता है। अजगर में मॉड्यूल यूयूआईडी वह है जो आप खोज रहे हैं।

import uuid
uuid.uuid4().hex

UUID4 आपको एक यादृच्छिक विशिष्ट पहचानकर्ता देता है जिसकी लंबाई md5 योग के समान है। हेक्स का प्रतिनिधित्व करेगा एक यूआईडी ऑब्जेक्ट लौटने के बजाय एक हेक्स स्ट्रिंग के रूप में।

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


44

यह अजगर 2.x और 3.x दोनों के लिए काम करता है

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

2
हेक्साडेसिमल एन्कोडिंग का यह तरीका अब पायथन 3 में काम नहीं करता है।
कारमदिर

1
धन्यवाद। यह यादृच्छिक हैश कुंजी बनाने का सबसे अच्छा तरीका है।
जेक

7
2.x और 3.x: binascii.hexlify (os.urandom (16)) के लिए काम करता है
क्ले

44

secretsमॉड्यूल अजगर 3.6+ में जोड़ा गया है। यह एकल कॉल के साथ क्रिप्टोग्राफिक रूप से सुरक्षित यादृच्छिक मान प्रदान करता है। फ़ंक्शन एक वैकल्पिक nbytesतर्क लेते हैं , डिफ़ॉल्ट 32 है (बाइट्स * 8 बिट्स = 256-बिट टोकन)। MD5 में 128-बिट हैश है, इसलिए "MD5-like" टोकन के लिए 16 प्रदान करें।

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

फिर भी एक और दृष्टिकोण। इसे प्राप्त करने के लिए आपको कोई प्रारूप तैयार नहीं करना पड़ेगा।

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'

मैं शायद hexadecimal अंकों को दर्शाने के लिए string.letters को 'abcdf' में बदल दूंगा। लेकिन महान समाधान!
राँचल

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

मैं यह नहीं कह रहा हूं कि यह किसी भी अन्य उत्तर के लिए तेज़ या बेहतर है; बस यह एक और दृष्टिकोण है :)




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)

यह भी ध्यान दिया जाना चाहिए कि एमडी 5 एक बहुत कमजोर हैश फ़ंक्शन है, यह भी टकराव पाया गया है (एक ही हैश में दो अलग-अलग प्लेनटेक्स्ट वैल्यू परिणाम) बस के लिए एक यादृच्छिक मूल्य का उपयोग करें plaintext


आवश्यक उपयोगकर्ता इनपुट मूल प्रश्न के "सबसे आसान" पहलू के साथ मदद नहीं करता है ...
मैके

क्या आपने अपना कोड चेक किया? यह लाइन 3 पर एक
परन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.