2012-10-01 14 views
5

मुझे 8 300 000 पंक्तियों के साथ एक विशाल तालिका मिली है (संपादित नहीं किया जाएगा और न ही कभी हटाया जाएगा)।MySQL - सीआरसी या एमडी 5 में मेरी अनुक्रमणिका को तेज करें?

मेरा पहला कॉलम कुछ समान दिखता है P300-4312B_X16_S और प्रविष्टि अद्वितीय नहीं है इसलिए मैं इस क्षेत्र पर एक नियमित INDEX का उपयोग करता हूं।

हालांकि, MySQL एक वर्चर के बजाय बाइनरी फ़ील्ड का उपयोग करके तेज़ी से रास्ता है, इसलिए मैं डेटा को स्टोर करने के लिए BINARY(16) का उपयोग करके एमडी 5 में अपना इंडेक्स एन्कोड करता हूं।

आज सुबह, मैंने पहली बार सीआरसी 32 का उपयोग करना शुरू कर दिया है और मैंने देखा है कि सीआरसी 32 8 वर्णों का उपयोग करके हेक्साडेसिमल स्ट्रिंग के रूप में आउटपुट हो सकता है।

मेरा प्रश्न: यदि मैं एमडी 5 के बजाय सीआरसी 32 का उपयोग करता हूं, तो यह तेज़ होगा। हालांकि, जब सीआरसी 32 भाग गया है तो दो 000 000 अद्वितीय मूल्य कहें, परिणाम अनूठा होगा या शायद कभी-कभी मेरे पास दो differents स्ट्रिंग के लिए दो बार समान स्ट्रिंग होगी? मैं पूछता हूं क्योंकि परिणाम एमडी 5 की तरह 32 (128 बी) की बजाय केवल 8 अक्षर (32 बी) लंबा है।

धन्यवाद।

+0

कृपया इस पृष्ठ पर एक नज़र डालें: http://www.dslreports.com/forum/remark,13525942 – jcho360

+1

बेशक आपको सीआरसी 32 के साथ और टक्कर मिल जाएगी। यह डेटा अखंडता जांच के लिए एक उपकरण है, एमएस 5 जैसे हैश फ़ंक्शन नहीं। हैश फ़ंक्शंस को जितना संभव हो सके छोटे टकराव (विभिन्न इनपुट के लिए एक ही परिणाम) के रूप में तैयार करने के लिए डिज़ाइन किया गया है। सीआरसी नहीं है। – dmitry

+0

'हालांकि, MySQL एक वर्चर के बजाय बाइनरी फ़ील्ड का उपयोग करके तेज़ी से तरीका है, इसलिए मैं डेटा को स्टोर करने के लिए BINARY (16) का उपयोग करके एमडी 5 में अपना इंडेक्स एन्कोड करता हूं। ऐसा लगता है जैसे आपकी अनुक्रमणिका टूट जाती है। 'वचरर' पर इंडेक्सिंग ठीक काम करना चाहिए .. –

उत्तर

7

टकराव की अपेक्षित संख्या संभव चेक मानों की संख्या से जोड़े की संख्या है। तो 2,000,000 मूल्यों के लिए (2000000 * 199 99 99)/2 जोड़े हैं, जो लगभग 2x10 है। 32-बिट सीआरसी के लिए, टकराव की अपेक्षित संख्या यह है कि 2 , जो 466 है। इसलिए आपको अनिवार्य रूप से उस मामले में टकराव की गारंटी है।

128-बिट एमडी 5 चेक वैल्यू के लिए, टकराव की अपेक्षित संख्या लगभग 6x10 -27 है। अपेक्षित संख्या के छोटे मूल्यों के लिए, यह एक टकराव की संभावना भी है।

यदि आपके लिए टकराव की बहुत कम संभावना है, तो आपको सीआरसी -32 के अलावा कुछ और चुनना होगा।

आपको एमडी 5 के ऊपरी हिस्से की आवश्यकता नहीं है, जहां इसकी क्रिप्टोग्राफिक शक्ति आपके आवेदन के लिए महत्वहीन है। आप वास्तव में परवाह नहीं करते हैं कि अगर कोई दुर्भावनापूर्ण एक अन्य प्रविष्टि के रूप में एक ही चेक वैल्यू के साथ प्रवेश करने का तरीका ढूंढ सकता है। इसलिए आप उस उद्देश्य के लिए डिज़ाइन किए गए 64-बिट गैर-क्रिप्टोग्राफ़िक हैश का उपयोग कर सकते हैं, जो बहुत तेज़ी से चलेंगे और 10,00012 मानों के मामले में टकराव की संभावना 10 -7 देगा। या आप एक 128-बिट गैर-क्रिप्टोग्राफिक हैश का उपयोग कर सकते हैं और एमडी 5 के लिए समान संभावना प्राप्त कर सकते हैं, लेकिन बहुत तेज़। हैश एल्गोरिदम के CityHash family पर एक नज़र डालें।

नोट हालांकि सभी मामलों में टकराव की संभावना शून्य नहीं है। आपको अपने कोड पर टकराव के परिणामों पर विचार करना चाहिए।

+0

मुझे आपका जवाब पसंद है क्योंकि अब मैं "हैश" के पीछे तर्क समझता हूं। मुझे कोई परवाह नहीं है कि आगंतुक को एन्कोडेड हैश मिल जाए, तो बस एक बस यात्रा को परिभाषित करना है। अगर उसे लगता है तो उसे एक यादृच्छिक बस यात्रा मिलेगी ... कोई बड़ा सौदा नहीं। मैं सिटीशैश परिवार पर एक नज़र डालेगा। धन्यवाद। –