2010-11-25 16 views
11

यदि मेरे पास 32 वर्ण स्ट्रिंग (एक एमडी 5 हैश) है और मैं बेस 64 का उपयोग करके इसे एन्कोड करता हूं, तो एन्कोडेड स्ट्रिंग की अधिकतम लंबाई क्या है?एमडी 5 हैश और बेस 64 एन्कोडिंग

+5

यदि आपके पास 32 वर्ण स्ट्रिंग है जो MD5 हैश है तो यह पहले ही हेक्स एन्कोडेड है और बेस 64 एन्कोड करने की आवश्यकता नहीं है। –

+1

एक एमडी 5 हैश हेक्साडेसिमल नहीं है! यह 16 बाइट्स है - हेक्साडेसिमल बस एक पारंपरिक प्रतिनिधित्व है। –

+2

@ ग्रेग्स, आप सही हैं कि एक MD5 हैश आमतौर पर हेक्साडेसिमल रूप में दर्शाया जाता है, जो बेस 64 का सबसेट है। लेकिन बेस 64 में कनवर्ट करने का एक उद्देश्य है - बेस 64 में कम वर्ण हैं क्योंकि इसमें एक बड़ा चरित्र सेट है। यदि आप हेक्साडेसिमल (32 वर्ण) नोटेशन के बजाय बेस 64 (22 वर्ण) का उपयोग करते हैं तो यह आपको सादे टेक्स्ट या एक वर्ण-एन्कोडिंग योजना में सहेजते समय डिस्क स्थान बचाएगा। –

उत्तर

31

एक MD5 मान बेस 22 नोटेशन में हमेशा 22 (उपयोगी) वर्ण है। कई बेस 64 एल्गोरिदम एमडी 5 हैश एन्कोड करते समय पैडिंग के 2 अक्षर भी जोड़ देंगे, जिससे कुल मिलाकर 24 वर्ण हो जाएंगे। पैडिंग कोई उपयोगी जानकारी नहीं जोड़ता है और इसे त्याग दिया जा सकता है। केवल पहले 22 अक्षर मायने रखते हैं।

एक MD5 हैश एक 128-बिट मूल्य है:

यहां इसका कारण बताया। बेस 64 स्ट्रिंग में प्रत्येक चरित्र में 6 बिट जानकारी होती है, क्योंकि चरित्र के लिए 64 संभावित मान होते हैं, और इसमें 64 तक पहुंचने के लिए 2 शक्तियां होती हैं। प्रत्येक चरित्र में 6 बिट जानकारी के साथ, 21 वर्णों में 126 बिट्स जानकारी होती है, और 22 वर्णों में 132 बिट जानकारी शामिल है। चूंकि 128 बिट 21 वर्णों के भीतर फिट नहीं हो सकते हैं, लेकिन 22 अक्षरों के भीतर फिट होते हैं (अतिरिक्त कमरे को छोड़ने के लिए), 128-बिट मान को बेस 64 में 22 वर्णों के रूप में हमेशा प्रदर्शित किया जाएगा।

गद्दी पर एक नोट:

मैं ऊपर है कि कई Base64 एन्कोडिंग एल्गोरिदम उल्लेख किया है जब एक MD5 मूल्य एन्कोडिंग गद्दी के पात्रों की एक जोड़ी जोड़ें। ऐसा इसलिए है क्योंकि बेस 64 जानकारी के 3 बाइट्स को 4 वर्णों के रूप में दर्शाता है। चूंकि एमडी 5 में 16 बाइट्स जानकारी है, इसलिए कई बेस 64 एन्कोडिंग एल्गोरिदम "==" को यह निर्दिष्ट करने के लिए जोड़ते हैं कि 16 बाइट्स का इनपुट 3 के अगले एकाधिक से कम 2 बाइट था, जो 18 बाइट्स होता। ये 2 बराबर संकेत स्ट्रिंग के लिए कोई भी जानकारी नहीं जोड़ते हैं, और भंडारण करते समय त्याग दिया जा सकता है।

7

प्रति http://en.wikipedia.org/wiki/Base64

के रूप में "ध्यान दें कि एन बाइट्स की एक इनपुट को देखते हुए उत्पादन किया जाएगा (n + 2 - ((n + 2)% 3))/3 * 4 बाइट्स लंबे, जो करने के लिए अभिमुख बड़े एन के लिए एन * 4/3 या 1.33333 एन। "

तो, यह होगा ((32 + 2 - (32 + 2)% 3))/3 * 4 = 34 - (34% 3)/3 * 4 = (34 - 1)/3 * 4 = 33/3 * 4 = 44 वर्ण।

आप इसे कच्चे बाइनरी रूप (128 बिट्स) में हमेशा निकालें और इसे सीधे 64 में एन्कोड कर सकते हैं, जिसका मतलब 32 के बजाय 16 बाइट्स को परिवर्तित करना है, जो बेस 64 एन्कोडेड होने पर 24 बाइट बन जाता है।

+5

एक एमडी 5 हैश 128 बिट्स है, जो 24 बेस 64 वर्णों को एन्कोड करेगा। –

+0

धन्यवाद Arantor! सही जवाब! –

+0

@ ग्रेग्स, क्षमा करें, हाँ, मैं SHA1 के बारे में सोच रहा था जो 160 बिट्स है। – Arantor

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