2011-03-13 19 views
43

में मैं कुछ यूनिकोड तार हैश करने के लिए प्रयास करें:हैश यूनिकोड स्ट्रिंग अजगर

hashlib.sha1(s).hexdigest() 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-81: 
ordinal not in range(128) 

जहां s की तरह कुछ है:

œ∑¡™£¢∞§¶•ªº–≠œ∑´®†¥¨ˆøπ“‘åß∂ƒ©˙∆˚¬…æΩ≈ç√∫˜µ≤≥÷åйцукенгшщзхъфывапролджэячсмитьбююю..юбьтијџўќ†њѓѕ'‘“«««\dzћ÷…•∆љl«єђxcvіƒm≤≥ї[email protected]#$©^&*(()––––––––––∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆∆•…÷ћzdzћ÷…•∆љlљ∆•…÷ћzћ÷…•∆љ∆•…љ∆•…љ∆•…∆љ•…∆љ•…љ∆•…∆•…∆•…∆•∆…•÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…÷∆•…

मैं क्या ठीक करना चाहिए?

+0

क्या यह एक यूनिकोड स्ट्रिंग है? –

उत्तर

78

स्पष्ट रूप से hashlib.sha1unicode ऑब्जेक्ट की अपेक्षा नहीं कर रहा है, बल्कि str ऑब्जेक्ट में बाइट्स का अनुक्रम है। बाइट (का उपयोग करते हुए कहते हैं, UTF-8 एन्कोडिंग) के एक दृश्य के लिए अपने unicode स्ट्रिंग एन्कोडिंग इसे ठीक करना चाहिए:

>>> import hashlib 
>>> s = u'é' 
>>> hashlib.sha1(s.encode('utf-8')) 
<sha1 HASH object @ 029576A0> 

त्रुटि है, क्योंकि यह स्वचालित रूप से एक str को unicode वस्तु कन्वर्ट करने के लिए कोशिश कर रहा है, का उपयोग करते हुए डिफ़ॉल्ट ascii एन्कोडिंग, जो उन सभी गैर-ASCII वर्णों को संभाल नहीं सकता है (क्योंकि आपकी स्ट्रिंग शुद्ध ASCII नहीं है)।

यूनिकोड और एन्कोडिंग के बारे में अधिक जानने के लिए एक अच्छा प्रारंभिक बिंदु Python docs है, और यह article by Joel Spolsky है।

+2

+1 पायथन 3 सही ढंग से 'टाइप एरर उठाता है: यूनिकोड-ऑब्जेक्ट्स को हैशिंग से पहले एन्कोड किया जाना चाहिए – jfs

+0

बहुत अच्छा जवाब। बहुत बहुत धन्यवाद, यह मदद करता है। (Python2.7) –

2

एन्कोडिंग उपयोग प्रारूप utf-8, इस आसान तरीका

>>> import hashlib 
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest() 
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f' 
0

आप हैश बाइट्स, नहीं तार प्रयास करें। तो आपको पता होना चाहिए कि बाइट्स वास्तव में हैश, यदि स्ट्रिंग का utf8 मेमोरी प्रस्तुति, स्ट्रिंग का utf16 मेमोरी प्रस्तुति इत्यादि

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