md5

2010-11-27 13 views
6

मैं फ़ाइल को सहेजे बिना पायल ऑब्जेक्ट का md5 कैसे प्राप्त कर सकता हूं?md5

imq.save('out.png') 
    hash = hashlib.md5(open('out.png','rb').read()).hexdigest() 

उत्तर

4

आप इसे एक StringIO बजाय करने के लिए लिख सकता है, और फिर उस के हैश ले।

1

कच्चे छवि डेटा को md5() पर फ़ीड करने के लिए आप निम्नलिखित पीआईएल Image क्लास विधि का उपयोग कर सकते हैं।

im.getdata() => अनुक्रम

एक अनुक्रम पिक्सेल मूल्यों से युक्त वस्तु के रूप में देता है एक छवि की सामग्री। अनुक्रम ऑब्जेक्ट फ़्लैट किया गया है, ताकि लाइन के लिए मान लाइन शून्य के मानों के बाद सीधे अनुसरण करें, और इसी तरह।

ध्यान दें कि यह नहीं होगा का उपयोग कर के परिणामस्वरूप MD5 हैश अपने नमूना कोड के रूप में ही है क्योंकि यह (कम से कम आंशिक रूप से) विशेष छवि फ़ाइल छवि को बचाने के लिए इस्तेमाल किया प्रारूप से स्वतंत्र है। यह उपयोगी हो सकता है यदि आप उस विशेष छवि फ़ाइल प्रारूप से स्वतंत्र वास्तविक छवियों की तुलना करना चाहते हैं, जिन्हें वे सहेजे जा सकते हैं।

इसका उपयोग करने के लिए आपको छवि डेटा के एमडी 5 हैश को कहीं भी किसी भी छवि फ़ाइल से स्वतंत्र करने की आवश्यकता होगी जब आवश्यक हो तो इसे पुनर्प्राप्त किया जा सकता है - पूरे फ़ाइल को मेमोरी में पढ़कर इसे उत्पन्न करने के विरोध में आपके प्रश्न में कोड जैसे बाइनरी डेटा के रूप में। इसके बजाय आपको हमेशा छवि को पीआईएल में लोड करने की आवश्यकता होगी और फिर हैश की गणना करने के लिए getdata() विधि का उपयोग करें।

5

टर्निंग @ कोड में इग्नेसियो का जवाब, this answer का उपयोग कर मदद करने के लिए:

import StringIO, hashlib 

output = StringIO.StringIO() 
img.save(output) 
hash = hashlib.md5(output.getvalue()).hexdigest() 

संदर्भित अन्य जवाब नोटों के रूप में, यह एक KeyError को जन्म दे सकता है, तो जनहित याचिका स्वचालित रूप से उत्पादन प्रारूप का पता लगाने की कोशिश करता है। इस समस्या से बचने के लिए आप मैन्युअल रूप से प्रारूप निर्दिष्ट कर सकते हैं:

img.save(output, format='GIF') 

(ध्यान दें:। मैं "img" का उपयोग किया है चर के रूप में, बल्कि अपने "IMQ" जो मैं लिखने में कोई त्रुटि थी कल्पना से)

+0

जब मैं करने के लिए बचाने की कोशिश या तो एक 'StringIO' या' BytesIO' वस्तु मैं एक 'KeyError' क्योंकि प्रारूप का पता नहीं लगाया जा सकता है; एक ज्ञात प्रारूप प्रदान करने से विभिन्न त्रुटियां उत्पन्न होती हैं। – FluxIX

+0

@ फ्लक्सिक्स kwargs प्रारूप = 'foo' के साथ KeyError से बचें (जैसा आपने संभवतः किया था)। किसी के लिए आपकी मदद करने के लिए आपको "अलग-अलग त्रुटियों" का वर्णन करना होगा। –

+0

मैं विभिन्न त्रुटियों के साथ मदद मांग नहीं रहा था, केवल पैरामीटर को एक कीवर्ड तर्क के रूप में निर्दिष्ट करता हूं। – FluxIX

12

असल में वहाँ सरल समाधान है:

hashlib.md5(img.tostring()).hexdigest() 
+5

ऐसा लगता है कि .tostring() को .tobytes() – BrianTheLion

+1

के पक्ष में 2.0 के रूप में बहिष्कृत किया गया है। 2017 में .tostring() अब समर्थित नहीं है, इसके बजाय .tobytes() का उपयोग करें – ksopyla

संबंधित मुद्दे