2011-04-12 13 views
13

के भाग की तुलना में मुझे जावा में "फ़ाइल" उदाहरण की दो अलग-अलग फ़ाइलों की तुलना करने की आवश्यकता है और इसे तेज़ हैश फ़ंक्शन के साथ करना है।जावा में कार्यान्वित "सबसे तेज़" हैश फ़ंक्शन, फ़ाइल

विचार: - फ़ाइल 1 में 20 पहले लाइनों Hashing - दो हैश की तुलना करें और सच्चे वापसी अगर उन बराबर हैं - फ़ाइल 2 में 20 पहले लाइनों Hashing।

मैं जावा में कभी भी "सबसे तेज़" हैश फ़ंक्शन लागू करना चाहता हूं। कौन सा आप चुनेंगे?

+0

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

+0

आप जिन फाइलों की तुलना करेंगे, उनके बारे में आप क्या जानते हैं? सबसे पहले आप अपने हैश के हिस्से के रूप में फ़ाइल आकार का उपयोग कर सकते हैं। आपके फाइल सिस्टम पर हजारों (या सैकड़ों हजारों) फ़ाइलों में से, दो फाइलों का एक बहुत ही कम प्रतिशत है, जिसमें एक ही फाइलसाइज है ... – SyntaxT3rr0r

उत्तर

24

यदि आप गति चाहते हैं, हैश नहीं है! विशेष रूप से एमडी 5 की तरह एक क्रिप्टोग्राफिक हैश नहीं। इन हैंश को रिवर्स करना असंभव होने के लिए डिज़ाइन किया गया है, गणना करने के लिए तेज़ी से नहीं। आपको क्या उपयोग करना चाहिए चेकसम - java.util.zip.Checksum और इसके दो ठोस कार्यान्वयन देखें। Adler32 गणना करने के लिए बेहद तेज़ है।

चेकसम या हैंश पर आधारित कोई भी विधि टकराव के लिए कमजोर है, लेकिन आप आरएसवाईएनसी के तरीके में दो अलग-अलग तरीकों का उपयोग करके जोखिम को कम कर सकते हैं।

एल्गोरिथ्म मूल रूप से है:

  • चेक फ़ाइल आकार बराबर
  • मिलान ब्लॉक के प्रत्येक जोड़ी पर
  • कंप्यूट चेकसम आकार एन बाइट्स की मात्रा में फ़ाइलों को तोड़ और तुलना कर रहे हैं। कोई अंतर साबित करता है कि फाइलें समान नहीं हैं।

यह एक अंतर की जल्दी पहचान के लिए अनुमति देता है। आप अलग-अलग एल्गोरिदम, या विभिन्न ब्लॉक आकारों के साथ एक बार में दो चेकसम की गणना करके इसे बेहतर बना सकते हैं।

परिणाम में अधिक बिट्स का मतलब टकराव का कम मौका है, लेकिन जैसे ही आप 64 बिट्स पर जाते हैं, आप जावा (और कंप्यूटर का सीपीयू) मूल रूप से संभाल सकते हैं और इसलिए धीमे हो जाते हैं, इसलिए एफएनवी-1024 कम है आपको झूठी नकारात्मक देने की संभावना है लेकिन बहुत धीमी है।

यदि यह गति के बारे में है, तो केवल एडलर 32 का उपयोग करें और स्वीकार करें कि बहुत ही कम अंतर नहीं मिलेगा। यह वास्तव में दुर्लभ है। इस तरह के चेकसम का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि इंटरनेट ट्रांसमिशन त्रुटियों को खोज सके, और आप कितनी बार गलत डेटा बदलते हैं?

यह वास्तव में सटीकता के बारे में है, आपको हर बाइट की तुलना करना होगा। कुछ और काम नहीं करेगा।

यदि आप गति और सटीकता के बीच समझौता कर सकते हैं, तो वहां विकल्पों का भरपूर धन है।

1

यदि आप एक ही सिस्टम पर एक ही समय में दो फाइलों की तुलना कर रहे हैं तो उनमें से दोनों को हैश करने की आवश्यकता नहीं है। बस दोनों फाइलों में बाइट्स की तुलना करें, जैसा कि आप दोनों पढ़ते हैं। यदि आप अलग-अलग समय पर उनकी तुलना करना चाहते हैं या वे अलग-अलग स्थानों पर हैं तो MD5 दोनों तेज़ और पर्याप्त होंगे। जब तक आप वास्तव में बड़ी फ़ाइलों से निपट नहीं लेते हैं, तब तक तेज़ होने की आवश्यकता नहीं होती है। यहां तक ​​कि मेरा लैपटॉप प्रति सेकंड सैकड़ों मेगाबाइट्स हैश कर सकता है।

यदि आप यह सत्यापित करना चाहते हैं कि वे समान हैं तो आपको पूरी फ़ाइल हैश करने की भी आवश्यकता है। अन्यथा यदि आप वास्तव में त्वरित जांच चाहते हैं तो आप आकार और अंतिम संशोधित समय की जांच भी कर सकते हैं। आप फ़ाइल की शुरुआत और अंत की जांच भी कर सकते हैं यदि वे वास्तव में बड़े हैं और आप भरोसा करते हैं कि बीच में बदलाव नहीं होगा। यदि आप सैकड़ों मेगाबाइट्स से निपट नहीं रहे हैं, तो आप प्रत्येक फ़ाइल के प्रत्येक बाइट को भी देख सकते हैं।

+0

मुझे अलग-अलग समय पर उन फ़ाइलों की तुलना करने की आवश्यकता है और जगहें तो मुझे लगता है कि हैशिंग यहां सबसे अच्छी पसंद है। मैं एमडी 5 के बारे में सोच रहा था लेकिन अगर कोई तेज था तो कुछ शोध करना चाहता था। आपके उत्तर के लिए धन्यवाद! – carloscloud

+0

आह, ठीक है। हाँ, एमडी 5 ठीक होने जा रहा है। यदि आप वास्तव में बड़ी फ़ाइलों से निपट रहे हैं तो यह है [जावा में फास्ट एमडी 5 कार्यान्वयन] (http://www.twmacinta.com/myjava/fast_md5.php)। – WhiteFang34

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