2012-05-24 10 views
25

अगर मैं कार्य करें:क्या md5 (file_contents_as_string) बराबर md5_file (/ path/to/file) होगा?

<?php echo md5(file_get_contents("/path/to/file")) ?>

... इस हमेशा एक ही हैश का उत्पादन करेगा के रूप में:

<?php echo md5_file("/path/to/file") ?>

+5

हम्म, पक्का नहीं कह सकता, लेकिन फाइल एक [बाइट क्रम चिह्न] शामिल है (http://en.wikipedia.org/wiki/Byte_order_mark) और स्ट्रिंग तो हैश नहीं होगा नहीं है बराबरी का। – vcsjones

+4

[हटाई गई टिप्पणी के जवाब में] मैं इसे अपने आप आज़मा सकता हूं। मैं सिर्फ चिंतित हूं कि अगर मुझे कोई मैच मिलता है और मैं md5() से md5_file() की तुलना करना शुरू करता हूं तो अलग-अलग हैंश उत्पन्न करने वाली रेखा के नीचे समस्याएं हो सकती हैं - शायद php_ini निर्देशों या मेरे सिर पर ऐसी कुछ चीज़ों के साथ करना डीबग/पहचान करने के लिए एक दुःस्वप्न बनें। – Tom

उत्तर

25

हाँ वे एक ही लौट:

var_dump(md5(file_get_contents(__FILE__))); 
var_dump(md5_file(__FILE__)); 

जो यह मेरे मामले में देता है:

string(32) "4d2aec3ae83694513cb9bde0617deeea" 
string(32) "4d2aec3ae83694513cb9bde0617deeea" 

संपादित करें: दोनों कार्यों के स्रोत कोड पर एक नज़र डालें: https://github.com/php/php-src/blob/master/ext/standard/md5.c (लाइन 47 & 76)। वे दोनों हैश उत्पन्न करने के लिए एक ही फ़ंक्शन का उपयोग करते हैं, सिवाय इसके कि md5_file() फ़ंक्शन फ़ाइल को पहले खुलता है।

दूसरा संपादित करें: असल में md5_file() फ़ंक्शन फ़ाइल सामग्री के आधार पर हैश फ़ाइल फ़ाइल सामग्री पर आधारित नहीं है, फ़ाइल नाम जैसे फ़ाइल मेटा डेटा पर नहीं। लिनक्स सिस्टम काम पर यह वही तरीका md5sum है। इस उदाहरण देखें:

[email protected]:~# echo foobar > foo.txt 
[email protected]:~# md5sum foo.txt 
14758f1afd44c09b7992073ccf00b43d foo.txt 
[email protected]:~# mv foo.txt bar.txt 
[email protected]:~# md5sum bar.txt 
14758f1afd44c09b7992073ccf00b43d bar.txt 
3

md5_file आदेश सिर्फ md5 के साथ एक फ़ाइल की सामग्री hashs।

आप पुराने md5_file पीएचपी कार्यान्वयन को संदर्भित करते हैं (लेकिन सिद्धांत अभी भी एक ही है) source:

function php_compat_md5_file($filename, $raw_output = false) 
{ 
// ... 
// removed protections 

if ($fsize = @filesize($filename)) { 
     $data = fread($fh, $fsize); 
    } else { 
     $data = ''; 
     while (!feof($fh)) { 
      $data .= fread($fh, 8192); 
     } 
    } 

    fclose($fh); 

    // Return 
    $data = md5($data); 
    if ($raw_output === true) { 
     $data = pack('H*', $data); 
    } 

    return $data; 
} 

तो अगर आप md5 किसी भी स्ट्रिंग या सामग्री के साथ हैश, तुम हमेशा के रूप में एक ही परिणाम प्राप्त करेंगे md5_file (उसी एन्कोडिंग और फ़ाइल सामग्री के लिए)।

उस मामले में, अगर आप file_get_content() के साथ एक फ़ाइल की सामग्री MD5 द्वारा हैश या यदि आप md5_file का उपयोग करें या आप अपनी फ़ाइल सामग्री के रूप में एक ही सामग्री के साथ md5 आदेश का उपयोग करें, भले ही, आप हमेशा एक ही परिणाम मिल जाएगा।

उदाहरण के लिए, आप एक फ़ाइल के फ़ाइल नाम को बदल सकते हैं, और दो अलग-अलग फ़ाइलों के लिए, एक ही सामग्री के साथ, वे एक ही एमडी 5 हैश का उत्पादन करेंगे।

उदाहरण द्वारा: दो "stackoverflow" (उद्धरण चिह्नों के बिना) का नाम दिया 1.txt और 2.txt युक्त फ़ाइलों को ध्यान में रखते

md5_file("1.txt"); 
md5_file("2.txt"); 

होगा उत्पादन

73868cb1848a216984dca1b6b0ee37bc 

आप बिल्कुल वही होगा नतीजा अगर आप md5("stackoverflow") या यदि आप md5(file_get_contents("1.txt")) या md5(file_get_contents("1.txt")).

+0

जिस स्रोत का आप उल्लेख कर रहे हैं वह फ़ंक्शन का पुराना PHP कार्यान्वयन है। लेकिन स्पष्टीकरण अच्छा है। – prehfeldt

+0

क्या आपके पास नया लिंक है? मेरे पास मुफ्त इंटरनेट एक्सेस नहीं है और यहां कई वेबसाइटें अवरुद्ध हैं। यदि आपके पास नया स्रोत है, तो मैं अपनी पोस्ट अपडेट कर दूंगा। –

+0

@ pier-alexandre-bouchard उन्होंने अपने उत्तर में प्रश्न में php स्रोत कोड का एक लिंक पोस्ट किया। :) – damianb

2

हाँ, मैंने इसे कई लोगों के लिए आजमाया बार।

660d4e394937c10cd1c16a98f44457c2 
660d4e394937c10cd1c16a98f44457c2 

कौन सा दोनों लाइनों पर बराबर लगता है: के रूप में

<?php echo md5(file_get_contents("1.php")) ?> 
<br/> 
<?php echo md5_file("1.php") ?> 

उत्पादन उत्पादन: मेरे मामले में, के लिए परिणाम।

3

फ़ाइल सामग्री के आधार पर, बीओएम या फ़ाइल का नाम

बीओएम के बारे में सही नहीं है यही कारण है कि जैसे फ़ाइल मेटाडाटा पर नहीं। बीओएम फ़ाइल सामग्री का एक हिस्सा है, आप किसी भी गैर-यूनिकोड फ़ाइल संपादक में अपने तीन बाइट्स देख सकते हैं।

+2

यह आपके उद्धरण के उत्तर पर एक टिप्पणी होनी चाहिए, न कि अपने उत्तर पर। – BHSPitMonkey

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