2013-04-25 4 views
5

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

मैं फ़ाइल के स्लाइस में पढ़ने के लिए नई HTML5 फ़ाइल एपीआई का उपयोग कर रहा हूं। मैं इसे फाइल के हैश देने के लिए SparkMD5 पर इसे बंद कर देता हूं। मुझे यह तथ्य पसंद है कि स्पार्कएमडी 5 मुझे एक वृद्धिशील हैश करने की इजाजत देता है इसलिए मुझे पूरी चीज को स्मृति में पढ़ने की ज़रूरत नहीं है।

कुल मिलाकर, स्पार्कएमडी 5 मेरी ज़रूरतों के लिए काम करता है लेकिन बड़ी फ़ाइलों के लिए मुझे अपना हैश (300 एमबी फ़ाइल के लिए लगभग 30 सेकंड) प्राप्त करने में कुछ समय लग सकता है। मैं आदर्श रूप से इसे कम करना चाहता हूं। मैं हैश फ़ंक्शंस पर जानकार नहीं हूं इसलिए मैं कुछ बंदरगाह नहीं देख रहा हूं और आदर्श रूप से पहले से ही लागू लाइब्रेरी की तलाश में हूं।

+1

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

+0

हाँ, मैंने सीआरसी 32 देखा लेकिन कहीं कहीं पढ़ा कि टक्कर दर% 0.4 है। मुझे यह जानने के लिए पर्याप्त जानकारी नहीं है कि यह सच है लेकिन ऐसा लगता है कि दूसरों को यह संकेत मिलता है कि इसकी उच्च टक्कर दर भी थी। –

+0

अपने प्रश्न का उत्तर देने के लिए मैं आदर्श रूप से 1 जीबी फ़ाइल के लिए कुछ सेकंड लेना चाहता हूं। मुझे नहीं पता कि यह यथार्थवादी है या नहीं। –

उत्तर

1

मैं benchmarked विभिन्न हैशिंग एल्गोरिदम, और यहाँ सबसे तेजी से विकल्प मैंने पाया है:

  • आप केवल 32 बिट डाइजेस्ट, iMurmurHash का उपयोग की जरूरत है। ध्यान दें कि इससे आपको लगभग 2 ** 14 (16,000) हैंश के बाद टक्कर मिल जाएगी।

  • यदि आपको 32 से अधिक बिट्स की आवश्यकता है तो SparkMD5 का उपयोग करें। मुझे 64 या 128 बिट मुरमुर कार्यान्वयन नहीं मिला, लेकिन स्पार्कएमडी 5 आश्चर्यजनक रूप से तेज़ (75 एमबी/सेकंड) था।

    • आप वृद्धिशील अद्यतन की जरूरत है, उन्हें SparkMD5 को खिलाने से पहले बड़े टुकड़ों में शामिल होने के तार पर विचार के रूप में SparkMD5 के वृद्धिशील हैशिंग कुछ मध्यम भूमि के ऊपर से ग्रस्त लगता है।

ये अनुशंसाएं शुद्ध जावास्क्रिप्ट के लिए कर रहे हैं। मैंने उन्हें तारों के साथ बेंचमार्क किया, लेकिन स्पार्कएमडी 5 ने ऐरेबफर भी ले लिया।


आप नोड पर तेजी से हैशिंग मॉड्यूल चाहते हैं, अपने सबसे अच्छे विकल्प थोड़े अलग हैं:

  • आप बफ़र hashing रहे हैं: का प्रयोग करें निर्मित MD5 एल्गोरिदम के साथ crypto मॉड्यूल।

    • यह करने के लिए अपवाद है: आप वृद्धिशील हैशिंग की जरूरत नहीं है, और आप 500 से अधिक एमबी/सेकंड throughput, की जरूरत है और आप एक देशी NPM निर्भरता के साथ ठीक कर रहे हैं, murmurhash-native का उपयोग कुछ अतिरिक्त प्रदर्शन के लिए। मैंने 128 बिट से कम पाचन आकार का परीक्षण नहीं किया, क्योंकि 128 बिट्स के साथ भी हैशिंग इतनी तेजी से है कि यह एक बाधा होने की संभावना नहीं है।

      (ध्यान दें कि murmurhash देशी तकनीकी रूप से वृद्धिशील हैशिंग का समर्थन करता है, लेकिन यह नोड के की तुलना में धीमी है में निर्मित इस मोड में MD5 एल्गोरिदम।)

  • आप एक ही स्ट्रिंग hashing रहे हैं, तो गैर संवर्द्धित, कन्वर्ट इसे एक बफर में और पिछले बुलेट बिंदु देखें।

  • आप तार संवर्द्धित hashing रहे हैं:

    • आप केवल 32 बिट की जरूरत है, iMurmurHash का उपयोग करें। ध्यान दें कि इससे आपको लगभग 2 ** 14 (16,000) हैंश के बाद टक्कर मिल जाएगी।

    • यदि आपको 32 से अधिक बिट्स की आवश्यकता है: MD5 एल्गोरिदम के साथ अंतर्निहित क्रिप्टो मॉड्यूल का उपयोग करें।

      • मैं सुझाव है कि आप तार बड़े टुकड़ों में एक साथ शामिल होने के साथ प्रयोग के बाद से तार परोक्ष बफ़र्स जब आप उन क्रिप्टो मॉड्यूल को पारित बदल रहे हैं, और प्रत्येक बफर निर्माण काफी धीमी है। बफर निर्माण और स्ट्रिंग में शामिल होने पर प्रदर्शन को आम तौर पर बाधित किया जाएगा, क्योंकि देशी हैशिंग फ़ंक्शन तुलना में बहुत तेज़ है।
+0

bout iMurmerHash जानने के लिए अच्छा है। ऐसा लगता है कि यह स्पार्कएमडी 5 जितना तेज़ है। आपने बताया कि आपको 75 एमबी/सेकेंड मिल रहा था जबकि मेरी मूल पोस्ट में 300 एमबी/30 सेकेंड हैं। निश्चित नहीं है कि अगर मैं छोटे हिस्सों (ऊपर उल्लिखित ओवरहेड) या धीमे कंप्यूटर (मेरा प्रश्न 4 साल पहले से था) के कारण धीमा था। –

+0

मेरे बेंचमार्क में भाग बहुत छोटे हैं - बस कुछ बाइट्स - तो मुझे धीमे कंप्यूटर और धीमे जावास्क्रिप्ट इंजन का अनुमान लगाया जाएगा। –

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