एमडी 5 हैश मूल्य बैश और पीएचपी से अलग है [डुप्लिकेट]


60

इस सवाल का पहले से ही यहाँ एक जवाब है:

मैंने एक स्ट्रिंग, "हैलो" का एमडी 5 योग (md5sum का उपयोग करके) उत्पन्न करने की कोशिश की । मैंने लिनक्स में md5sum टूल के रूप में विभिन्न तरीकों की कोशिश की, PHP के MD5 () फ़ंक्शन के साथ-साथ md5sum अनुवादकों के लिए विभिन्न ऑनलाइन पाठ।

echo "hello" | md5sum

तथा

echo "hello" > file && md5sum file

का परिणाम दिया b1946ac92492d2347c6235b4d2611184। हालांकि, PHP के md5 () फ़ंक्शन और लगभग सभी ऑनलाइन जनरेटर ने आउटपुट दिया 5D41402ABC4B2A76B9719D911017C592

क्या कारण है?


38
इको-एन "हैलो"
मार्टिन यॉर्क

जवाबों:


80

डिफ़ॉल्ट रूप से, echoआउटपुट के अंत में एक नई लाइन वर्ण शामिल है। हालाँकि, PHP और आपके द्वारा उपयोग की जाने वाली ऑनलाइन साइटों में नई रेखा शामिल नहीं है। न्यूलाइन वर्ण को दबाने के लिए, -nध्वज का उपयोग करें :

echo -n "hello" | md5sum

आउटपुट:

5d41402abc4b2a76b971919911017c592 -

देख: help echo


या प्रिंटफ के साथ:

printf "%s" "hello" | md5sum

मैं POSIX द्वारा अनिर्दिष्ट व्यवहार पर निर्भर रहने वाले व्यक्ति के समक्ष अधिक व्यापक रूप से संगत रूप दिखाने का सुझाव दूंगा।
चार्ल्स डफी

धन्यवाद। मैं समस्या को पहले अपने उदाहरण और प्रतिध्वनि के व्यवहार के साथ दिखाना पसंद करता हूं।
साइरस

7
जब तक आप ओपी के ऑपरेटिंग सिस्टम को नहीं जानते, आप नहीं जानते कि "उनके अपने उदाहरण" का संशोधित संस्करण वास्तव में काम करेगा। यदि उनका लिनक्स एक स्ट्रिप-डाउन बिजीबॉक्स का उपयोग कर रहा है तो echo -nप्रतिध्वनित हो सकता -nहै।
चार्ल्स डफी

मुझे ओपी का ऑपरेटिंग सिस्टम पता है।
सायरस

वे अपना कर्नेल निर्दिष्ट करते हैं, लेकिन वे इससे अधिक कहाँ कहते हैं?
चार्ल्स डफी

100

@ साइरस का जवाब बिल्कुल इस बात पर है कि इसे कैसे हल किया जाए - यह समझाने के लिए कि echoइसका उपयोग करते समय यह स्ट्रिंग के अंत में एक नई पंक्ति का उत्पादन करेगा। जैसा कि आप इस ऑनलाइन आउटपुट पर देख सकते हैं, helloएक नईलाइन आउटपुट के साथ बिल्कुल एमडी 5 आप पहले प्राप्त कर रहे थे। -nन्यूलाइन को दबाने का उपयोग करना , और फिर आपको अपेक्षित परिणाम देगा।

यहाँ छवि विवरण दर्ज करें

संपादित करें :

आप इसे स्पष्ट रूप से देख सकते हैं यदि आप इसे आउटपुट करते हैं hexdump, जो वहां बाइट्स के हेक्साडेसिमल को दर्शाता है।

$ echo "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65 0a              |str_example.|

स्ट्रिंग के अंत में 0a( \n) देखें

$ echo -n "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65                 |str_example|

-nगूंज के साथ \nअंत में एक नई लाइन ( ) नहीं डालती है

अब एक खाली तार के साथ

$ echo  "" | hd
00000000  0a                                                |.|

बस नई लाइन चरित्र

$ echo -n  "" | hd

रिक्त स्ट्रिंग, इसलिए hexdumpकोई आउटपुट नहीं दिखाता है


2
पाइप के लिए और अधिक दिलचस्प होगा echo helloऔर echo -n helloकरने के लिए hexdump -Cक्रमश:;)
टॉम यान

19
मैं इसके खिलाफ सलाह देता हूं echo -n, क्योंकि यह अमानक है और असंगत रूप से समर्थित है ( स्वेन मैस्किट द्वारा असंगतता के लिएecho और अधिक विस्तृत सूची देखें )। आप चाहते हैं कि यह लगातार काम करे, printfइसके बजाय उपयोग करें ; यह उपयोग करने के लिए थोड़ा अधिक जटिल है (आपको प्रिंट किए गए डेटा के अलावा एक प्रारूप स्ट्रिंग निर्दिष्ट करना होगा), लेकिन परेशानी से बचने के लिए IMO इसके लायक है। इस मामले में, printf "%s" "hello"चाल चलेगा।
गॉर्डन डेविसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.