जावास्क्रिप्ट में सबसे तेज़ एमडी 5 कार्यान्वयन


236

वहाँ कई MD5 जावास्क्रिप्ट कार्यान्वयन वहाँ हैं। क्या किसी को पता है कि कौन सा सबसे उन्नत, सबसे बग़ीचा और सबसे तेज़ है?

मुझे इस टूल के लिए इसकी आवश्यकता है ।


2
आपको "तेज़" एमडी 5 कार्यान्वयन की आवश्यकता क्यों है?
एंथनीवजोन

3
@AnthonyWJones को किसी अन्य प्रकार के md5 फ़ंक्शन की आवश्यकता है? यह "धीमी" md5 फ़ंक्शन की तरह नहीं है जो वास्तव में किसी भी उद्देश्य को पूरा करता है .. क्या यह करता है?
ली ओलय्यवर

5
@LeeOlayvar एक क्रिप्टोग्राफी फ़ंक्शन धीमा है, अब उस फ़ंक्शन का उपयोग करके किसी दिए गए हैश को bruteforce करने में अधिक समय लगेगा।
मथियास ब्येनेंस

45
@MathiasBynens हाँ, लेकिन डिज़ाइन द्वारा, md5 एक तेज़ हैश है। यह कहना है, यह बड़ी मात्रा में डेटा की खपत और बहुत तेजी से एक हैश उत्पादन करने के लिए डिज़ाइन किया गया है। यह अनिवार्य रूप से आखिरी चीज है जिसे आप सुरक्षित डेटा जैसे पासवर्ड / आदि संग्रहीत करना चाहते हैं, और डेटा की पहचान करने के लिए बेहतर अनुकूल / डिज़ाइन किया गया है । दूसरी तरफ धीमी गति से राख, जमीन से धीमी गति से डिजाइन किए जाते हैं। एक बड़े कार्य मूल्य के साथ धीमी हैश के लिए मजबूर करना, एक आसान काम नहीं है। जैसे, धीमी गति से हैश पासवर्ड के लिए आदर्श होते हैं। MD5 कई (सबसे?) मामलों में पासवर्ड के लिए खराब है। मैं इस क्षेत्र का विशेषज्ञ नहीं हूं, इसलिए इसे नमक के साथ लें। :)
ली ओलायवार

16
हां, लेकिन जैसा कि एक युक्ति है कि एक एमडी 5 हैश जैसा दिखता है, वह अनिवार्य है, इससे कोई फर्क नहीं पड़ता कि आप इसे जल्दी या धीरे से गणना करते हैं। अंतिम परिणाम समान है और समान रूप से कठिन / आसान होगा। तो यह करता है सबसे तेजी से कार्यान्वयन उपयोग करने के लिए मेकअप भावना।
स्टिजन डे विट

जवाबों:


168

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

http://www.webreference.com/programming/javascript/jkm3/

उनका एमडी 5 कार्यान्वयन यहां पाया जा सकता है


123
"मेरे जावास्क्रिप्ट एमडी 5 कोड को हर किसी की तुलना में तेज़ बनाने के लिए, मुझे स्थानीय फ़ंक्शन चर का लाभ उठाना पड़ा।" एक सफलता क्या है!
ग्लेन मेनार्ड

11
इस md5 लाइब्रेरी का एक प्रदर्शन यहाँ पाया जा सकता है: jsfiddle.net/v28gq
एंडरसन ग्रीन

15
मायर्स कोड के लिए लाइसेंस क्या है? वह यह नहीं बताता है कि यह उसकी वेबसाइट पर लाइसेंस प्राप्त है (या नहीं) जहाँ तक मैं बता सकता हूँ।
जेरोएनहॉक

25
यह मुझे परेशान करता है कि यह कार्यान्वयन वैश्विक कार्यों का एक समूह बनाता है, इसलिए मैंने पूरी चीज़ को एक बंद में लपेट दिया, प्रत्येक फ़ंक्शन को एक चर बना दिया और md5 फ़ंक्शन को विंडो ऑब्जेक्ट को सौंपा। यह स्पष्ट रूप से मान रहा है कि एक खिड़की वस्तु है, लेकिन यह सभी सहायक कार्यों को निजी रखेगा। मुझे यकीन नहीं है कि कैसे (यदि बिल्कुल) यह प्रदर्शन को प्रभावित करेगा, लेकिन बड़े अनुप्रयोगों में उपयोग के लिए यह अधिक सुरक्षित होना चाहिए। gist.github.com/jhoff/7680711
jhoff

6
@ झॉफ योर गिस्ट को फोर्क किया गया है और एक दो बार सुधारा गया है, मुझे भी लगता है कि var add32ऑन लाइन १ be५ होना चाहिए add32इसलिए मुझे सबसे अच्छा कांटा मिला और मैंने इसे इस नए संस्करण में अपडेट किया: gist.github.com/Michaeloteote/3f0cefaaa9578d7e30be
मिकापोटे

73

मैं आपको इस मामले में CryptoJS का उपयोग करने का सुझाव दूंगा।

मूल रूप से CryptoJS सर्वोत्तम प्रथाओं और पैटर्न का उपयोग करके जावास्क्रिप्ट में कार्यान्वित मानक और सुरक्षित क्रिप्टोग्राफ़िक एल्गोरिदम का एक बढ़ता हुआ संग्रह है। वे तेज़ हैं, और उनके पास एक सुसंगत और सरल इंटरफ़ेस है।

इसलिए यदि आप अपने पासवर्ड स्ट्रिंग के एमडी 5 हैश की गणना करना चाहते हैं तो निम्नानुसार करें:

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/core.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/md5.js"></script>
<script>
    var passhash = CryptoJS.MD5(password).toString();

    $.post(
      'includes/login.php', 
      { user: username, pass: passhash },
      onLogin, 
      'json' );
</script>

तो यह स्क्रिप्ट आपके पासवर्ड स्ट्रिंग के हैश को सर्वर पर पोस्ट कर देगी।

अन्य जानकारी और अन्य हैश गणना एल्गोरिदम पर आप यात्रा कर सकते हैं पर समर्थन के लिए:

http://code.google.com/p/crypto-js/


59
आपको पासवर्ड के लिए md5 का उपयोग नहीं करना चाहिए।
लुकास एलिसिस

3
ऐसा लगता है कि "Google कोड" पर अभी भी लंबे समय से पहले अनाथ हो जाएगा। कोई बनाए नहीं रखता?
मृइलू

2
md5 तेज है और अगर कोई आपकी साइट को क्रैक करता है और आपका db और कोड लीक हो जाता है तो आप हमेशा हैश के साथ db उत्पन्न कर सकते हैं और पासवर्ड को डीकोड कर सकते हैं। 10M उपयोगकर्ताओं और कोड के साथ मुझे अपना लाइव डेटाबेस दें। मैं उस के साथ मज़े करूंगा और इंटरनेट पर मेरे डिकोड किए गए परिणाम पोस्ट करूंगा। चीयर्स।
लुकास लाइज़िस

2
लिंक अब 404 पेज की ओर जाता है
एडम एफ


29

लाइब्रेरी का चयन करते समय यह देखना भी महत्वपूर्ण है कि क्या यह बोवर जैसे आधुनिक फ्रेमवर्क का समर्थन करता है, jslint से गुजरता है, JQuery या मॉड्यूल सिस्टम के लिए प्लगइन मॉडल का समर्थन करता है जैसे कि सक्रिय विकास में होने के अलावा एएमडी / रिक्जेस्ट्स और 1 से अधिक योगदानकर्ता हैं। ऐसे कुछ विकल्प हैं जो इन अतिरिक्त मानदंडों में से कुछ या सभी को संतुष्ट करते हैं:

  • CryptoJS : यह शायद सबसे अधिक विस्तारित पुस्तकालय है जहां प्रत्येक एल्गोरिथ्म को आपके जेएस कोड में वसा को जोड़ने के बिना अलग से उपयोग किया जा सकता है। इसके अलावा यह UTF8, UTF16 और Base64 के लिए एनकोडर / डिकोडर के रूप में है। मैं गितुब भंडार को बनाए रखता हूं जो कि बावर पैकेज के साथ-साथ निर्देश के साथ पंजीकृत कि इसे कैसे उपयोग करना है।
  • स्पार्क एमडी 5 : यह जेकेएम कोड पर आधारित है जिसमें अन्य उत्तर का उल्लेख है जो तेजी से कार्यान्वयन भी है। हालांकि इसके अलावा, स्पार्क कार्यान्वयन एएमडी समर्थन जोड़ता है, पास jslint प्लस में वृद्धिशील मोड है। इसमें Base64 o / p नहीं है, लेकिन इसमें कच्चा o / p है (यानी स्ट्रिंग के 32-बिट int insead की)।
  • JQuery MD5 प्लगइन : पृथ्वी के लिए बहुत सरल है, लेकिन कच्चे मोड के लिए प्रतीत नहीं होता है।
  • जावास्क्रिप्ट-एमडी 5 : स्पार्क के रूप में फैंसी या तेज नहीं बल्कि सरल।

CryptoJS से उदाहरण:

//just include md5.js from the CryptoJS rollups folder
var hash = CryptoJS.MD5("Message");
console.log(hash.toString()); 

उपरोक्त पुस्तकालयों के बीच http://jsperf.com/md5-shootout/7 पर प्रदर्शन की तुलना है । मेरी मशीन पर वर्तमान परीक्षण (जो कि पुराने रूप से पुराने हैं) से पता चलता है कि यदि आप गति की तलाश कर रहे हैं तो स्पार्क एमडी 5 आपका सबसे अच्छा दांव है (और ऐसा ही सादा जेकेएम कोड है)। हालाँकि यदि आप अधिक व्यापक पुस्तकालय की तलाश में हैं तो CryptoJS आपकी सबसे अच्छी शर्त है, हालांकि स्पार्क MD5 की तुलना में यह 79% धीमा है। हालाँकि मुझे लगता है कि CryptoJS अंततः उसी गति को प्राप्त करेगा क्योंकि यह थोड़ी अधिक सक्रिय परियोजना है।


"JQuery MD5 प्लगइन" का लिंक मुझे एक मैलवेयर साइट पर ले जाता है। खें!
रफी

1
ऐसा लगता है कि jQuery के MD5 प्लगइन के लिए मूल वेबसाइट शटडाउन हो गई है और इसके अब सामान्य डोमेन विक्रेता को पुनर्निर्देशित कर दिया गया है। मैंने अब GitHub में होस्ट किए गए प्लगइन को अपडेट कर दिया है।
शीतल शाह

14

MD5 = function(e) {
    function h(a, b) {
        var c, d, e, f, g;
        e = a & 2147483648;
        f = b & 2147483648;
        c = a & 1073741824;
        d = b & 1073741824;
        g = (a & 1073741823) + (b & 1073741823);
        return c & d ? g ^ 2147483648 ^ e ^ f : c | d ? g & 1073741824 ? g ^ 3221225472 ^ e ^ f : g ^ 1073741824 ^ e ^ f : g ^ e ^ f
    }

    function k(a, b, c, d, e, f, g) {
        a = h(a, h(h(b & c | ~b & d, e), g));
        return h(a << f | a >>> 32 - f, b)
    }

    function l(a, b, c, d, e, f, g) {
        a = h(a, h(h(b & d | c & ~d, e), g));
        return h(a << f | a >>> 32 - f, b)
    }

    function m(a, b, d, c, e, f, g) {
        a = h(a, h(h(b ^ d ^ c, e), g));
        return h(a << f | a >>> 32 - f, b)
    }

    function n(a, b, d, c, e, f, g) {
        a = h(a, h(h(d ^ (b | ~c), e), g));
        return h(a << f | a >>> 32 - f, b)
    }

    function p(a) {
        var b = "",
            d = "",
            c;
        for (c = 0; 3 >= c; c++) d = a >>> 8 * c & 255, d = "0" + d.toString(16), b += d.substr(d.length - 2, 2);
        return b
    }
    var f = [],
        q, r, s, t, a, b, c, d;
    e = function(a) {
        a = a.replace(/\r\n/g, "\n");
        for (var b = "", d = 0; d < a.length; d++) {
            var c = a.charCodeAt(d);
            128 > c ? b += String.fromCharCode(c) : (127 < c && 2048 > c ? b += String.fromCharCode(c >> 6 | 192) : (b += String.fromCharCode(c >> 12 | 224), b += String.fromCharCode(c >> 6 & 63 | 128)), b += String.fromCharCode(c & 63 | 128))
        }
        return b
    }(e);
    f = function(b) {
        var a, c = b.length;
        a = c + 8;
        for (var d = 16 * ((a - a % 64) / 64 + 1), e = Array(d - 1), f = 0, g = 0; g < c;) a = (g - g % 4) / 4, f = g % 4 * 8, e[a] |= b.charCodeAt(g) << f, g++;
        a = (g - g % 4) / 4;
        e[a] |= 128 << g % 4 * 8;
        e[d - 2] = c << 3;
        e[d - 1] = c >>> 29;
        return e
    }(e);
    a = 1732584193;
    b = 4023233417;
    c = 2562383102;
    d = 271733878;
    for (e = 0; e < f.length; e += 16) q = a, r = b, s = c, t = d, a = k(a, b, c, d, f[e + 0], 7, 3614090360), d = k(d, a, b, c, f[e + 1], 12, 3905402710), c = k(c, d, a, b, f[e + 2], 17, 606105819), b = k(b, c, d, a, f[e + 3], 22, 3250441966), a = k(a, b, c, d, f[e + 4], 7, 4118548399), d = k(d, a, b, c, f[e + 5], 12, 1200080426), c = k(c, d, a, b, f[e + 6], 17, 2821735955), b = k(b, c, d, a, f[e + 7], 22, 4249261313), a = k(a, b, c, d, f[e + 8], 7, 1770035416), d = k(d, a, b, c, f[e + 9], 12, 2336552879), c = k(c, d, a, b, f[e + 10], 17, 4294925233), b = k(b, c, d, a, f[e + 11], 22, 2304563134), a = k(a, b, c, d, f[e + 12], 7, 1804603682), d = k(d, a, b, c, f[e + 13], 12, 4254626195), c = k(c, d, a, b, f[e + 14], 17, 2792965006), b = k(b, c, d, a, f[e + 15], 22, 1236535329), a = l(a, b, c, d, f[e + 1], 5, 4129170786), d = l(d, a, b, c, f[e + 6], 9, 3225465664), c = l(c, d, a, b, f[e + 11], 14, 643717713), b = l(b, c, d, a, f[e + 0], 20, 3921069994), a = l(a, b, c, d, f[e + 5], 5, 3593408605), d = l(d, a, b, c, f[e + 10], 9, 38016083), c = l(c, d, a, b, f[e + 15], 14, 3634488961), b = l(b, c, d, a, f[e + 4], 20, 3889429448), a = l(a, b, c, d, f[e + 9], 5, 568446438), d = l(d, a, b, c, f[e + 14], 9, 3275163606), c = l(c, d, a, b, f[e + 3], 14, 4107603335), b = l(b, c, d, a, f[e + 8], 20, 1163531501), a = l(a, b, c, d, f[e + 13], 5, 2850285829), d = l(d, a, b, c, f[e + 2], 9, 4243563512), c = l(c, d, a, b, f[e + 7], 14, 1735328473), b = l(b, c, d, a, f[e + 12], 20, 2368359562), a = m(a, b, c, d, f[e + 5], 4, 4294588738), d = m(d, a, b, c, f[e + 8], 11, 2272392833), c = m(c, d, a, b, f[e + 11], 16, 1839030562), b = m(b, c, d, a, f[e + 14], 23, 4259657740), a = m(a, b, c, d, f[e + 1], 4, 2763975236), d = m(d, a, b, c, f[e + 4], 11, 1272893353), c = m(c, d, a, b, f[e + 7], 16, 4139469664), b = m(b, c, d, a, f[e + 10], 23, 3200236656), a = m(a, b, c, d, f[e + 13], 4, 681279174), d = m(d, a, b, c, f[e + 0], 11, 3936430074), c = m(c, d, a, b, f[e + 3], 16, 3572445317), b = m(b, c, d, a, f[e + 6], 23, 76029189), a = m(a, b, c, d, f[e + 9], 4, 3654602809), d = m(d, a, b, c, f[e + 12], 11, 3873151461), c = m(c, d, a, b, f[e + 15], 16, 530742520), b = m(b, c, d, a, f[e + 2], 23, 3299628645), a = n(a, b, c, d, f[e + 0], 6, 4096336452), d = n(d, a, b, c, f[e + 7], 10, 1126891415), c = n(c, d, a, b, f[e + 14], 15, 2878612391), b = n(b, c, d, a, f[e + 5], 21, 4237533241), a = n(a, b, c, d, f[e + 12], 6, 1700485571), d = n(d, a, b, c, f[e + 3], 10, 2399980690), c = n(c, d, a, b, f[e + 10], 15, 4293915773), b = n(b, c, d, a, f[e + 1], 21, 2240044497), a = n(a, b, c, d, f[e + 8], 6, 1873313359), d = n(d, a, b, c, f[e + 15], 10, 4264355552), c = n(c, d, a, b, f[e + 6], 15, 2734768916), b = n(b, c, d, a, f[e + 13], 21, 1309151649), a = n(a, b, c, d, f[e + 4], 6, 4149444226), d = n(d, a, b, c, f[e + 11], 10, 3174756917), c = n(c, d, a, b, f[e + 2], 15, 718787259), b = n(b, c, d, a, f[e + 9], 21, 3951481745), a = h(a, q), b = h(b, r), c = h(c, s), d = h(d, t);
    return (p(a) + p(b) + p(c) + p(d)).toLowerCase()
};
<!DOCTYPE html>
<html>
<body onload="md5.value=MD5(a.value);">

<form oninput="md5.value=MD5(a.value)">Enter String:
<input type="string" id="a" name="a" value="https://www.zibri.org"></br></br>MD5:<output id="md5" name="md5" for="a"></output>
</form>

</body>
</html>


लेकिन ऐसा लगता है कि सबसे तेज़ कार्यान्वयन यह है: myersdaily.org/joseph/javascript/jkm-md5.js
जिबरी

यह लिंक myersdaily.org/joseph/javascript/jkm-md5.js
गिग्स

@ गिग्स सिर्फ गूगल का उपयोग करते हैं और आप इसे पा लेंगे: pajhome.org.uk/crypt/md5/contrib/jkm-md5.js
जिबरी

11

मुझे इस विषय पर कई लेख मिले। उन्होंने सभी को जोसेफ मेयर्स के कार्यान्वयन का सुझाव दिया।

देखें: कुछ परीक्षणों पर http://jsperf.com/md5-shootout

परम गति के लिए मेरी खोज में मैंने इस कोड को देखा, एक i ने देखा कि इसमें सुधार किया जा सकता है। इसलिए मैंने जोसेफ मेयर्स कोड के आधार पर एक नया JS स्क्रिप्ट बनाया।

देखना बेहतर Jospeh मेयर्स कोड


11
कांटा क्यों, इसके बजाय अपने पैच को बनाए रखने के लिए वापस प्रस्तुत करने के लिए?
निक जेनिंग्स


5

मुझे केवल HTML5 ब्राउज़र का समर्थन करने की आवश्यकता है जो टाइप किए गए सरणियों (DataView, ArrayBuffer, आदि) का समर्थन करते हैं। मुझे लगता है कि मैंने यूसुफ मायर्स कोड लिया और इसे Uint8Array में पास करने के लिए संशोधित किया। मैंने सभी सुधारों को नहीं पकड़ा, और अभी भी कुछ चार () सरणी कलाकृतियां हैं जिन पर सुधार किया जा सकता है। मुझे PouchDB प्रोजेक्ट में जोड़ने के लिए इसकी आवश्यकता थी।

var PouchUtils = {};
PouchUtils.Crypto = {};
(function () {
    PouchUtils.Crypto.MD5 = function (uint8Array) {
        function md5cycle(x, k) {
            var a = x[0], b = x[1], c = x[2], d = x[3];

            a = ff(a, b, c, d, k[0], 7, -680876936);
            d = ff(d, a, b, c, k[1], 12, -389564586);
            c = ff(c, d, a, b, k[2], 17, 606105819);
            b = ff(b, c, d, a, k[3], 22, -1044525330);
            a = ff(a, b, c, d, k[4], 7, -176418897);
            d = ff(d, a, b, c, k[5], 12, 1200080426);
            c = ff(c, d, a, b, k[6], 17, -1473231341);
            b = ff(b, c, d, a, k[7], 22, -45705983);
            a = ff(a, b, c, d, k[8], 7, 1770035416);
            d = ff(d, a, b, c, k[9], 12, -1958414417);
            c = ff(c, d, a, b, k[10], 17, -42063);
            b = ff(b, c, d, a, k[11], 22, -1990404162);
            a = ff(a, b, c, d, k[12], 7, 1804603682);
            d = ff(d, a, b, c, k[13], 12, -40341101);
            c = ff(c, d, a, b, k[14], 17, -1502002290);
            b = ff(b, c, d, a, k[15], 22, 1236535329);

            a = gg(a, b, c, d, k[1], 5, -165796510);
            d = gg(d, a, b, c, k[6], 9, -1069501632);
            c = gg(c, d, a, b, k[11], 14, 643717713);
            b = gg(b, c, d, a, k[0], 20, -373897302);
            a = gg(a, b, c, d, k[5], 5, -701558691);
            d = gg(d, a, b, c, k[10], 9, 38016083);
            c = gg(c, d, a, b, k[15], 14, -660478335);
            b = gg(b, c, d, a, k[4], 20, -405537848);
            a = gg(a, b, c, d, k[9], 5, 568446438);
            d = gg(d, a, b, c, k[14], 9, -1019803690);
            c = gg(c, d, a, b, k[3], 14, -187363961);
            b = gg(b, c, d, a, k[8], 20, 1163531501);
            a = gg(a, b, c, d, k[13], 5, -1444681467);
            d = gg(d, a, b, c, k[2], 9, -51403784);
            c = gg(c, d, a, b, k[7], 14, 1735328473);
            b = gg(b, c, d, a, k[12], 20, -1926607734);

            a = hh(a, b, c, d, k[5], 4, -378558);
            d = hh(d, a, b, c, k[8], 11, -2022574463);
            c = hh(c, d, a, b, k[11], 16, 1839030562);
            b = hh(b, c, d, a, k[14], 23, -35309556);
            a = hh(a, b, c, d, k[1], 4, -1530992060);
            d = hh(d, a, b, c, k[4], 11, 1272893353);
            c = hh(c, d, a, b, k[7], 16, -155497632);
            b = hh(b, c, d, a, k[10], 23, -1094730640);
            a = hh(a, b, c, d, k[13], 4, 681279174);
            d = hh(d, a, b, c, k[0], 11, -358537222);
            c = hh(c, d, a, b, k[3], 16, -722521979);
            b = hh(b, c, d, a, k[6], 23, 76029189);
            a = hh(a, b, c, d, k[9], 4, -640364487);
            d = hh(d, a, b, c, k[12], 11, -421815835);
            c = hh(c, d, a, b, k[15], 16, 530742520);
            b = hh(b, c, d, a, k[2], 23, -995338651);

            a = ii(a, b, c, d, k[0], 6, -198630844);
            d = ii(d, a, b, c, k[7], 10, 1126891415);
            c = ii(c, d, a, b, k[14], 15, -1416354905);
            b = ii(b, c, d, a, k[5], 21, -57434055);
            a = ii(a, b, c, d, k[12], 6, 1700485571);
            d = ii(d, a, b, c, k[3], 10, -1894986606);
            c = ii(c, d, a, b, k[10], 15, -1051523);
            b = ii(b, c, d, a, k[1], 21, -2054922799);
            a = ii(a, b, c, d, k[8], 6, 1873313359);
            d = ii(d, a, b, c, k[15], 10, -30611744);
            c = ii(c, d, a, b, k[6], 15, -1560198380);
            b = ii(b, c, d, a, k[13], 21, 1309151649);
            a = ii(a, b, c, d, k[4], 6, -145523070);
            d = ii(d, a, b, c, k[11], 10, -1120210379);
            c = ii(c, d, a, b, k[2], 15, 718787259);
            b = ii(b, c, d, a, k[9], 21, -343485551);

            x[0] = add32(a, x[0]);
            x[1] = add32(b, x[1]);
            x[2] = add32(c, x[2]);
            x[3] = add32(d, x[3]);

        }

        function cmn(q, a, b, x, s, t) {
            a = add32(add32(a, q), add32(x, t));
            return add32((a << s) | (a >>> (32 - s)), b);
        }

        function ff(a, b, c, d, x, s, t) {
            return cmn((b & c) | ((~b) & d), a, b, x, s, t);
        }

        function gg(a, b, c, d, x, s, t) {
            return cmn((b & d) | (c & (~d)), a, b, x, s, t);
        }

        function hh(a, b, c, d, x, s, t) {
            return cmn(b ^ c ^ d, a, b, x, s, t);
        }

        function ii(a, b, c, d, x, s, t) {
            return cmn(c ^ (b | (~d)), a, b, x, s, t);
        }

        function md51(s) {
            txt = '';
            var n = s.length,
            state = [1732584193, -271733879, -1732584194, 271733878], i;
            for (i = 64; i <= s.length; i += 64) {
                md5cycle(state, md5blk(s.subarray(i - 64, i)));
            }
            s = s.subarray(i - 64);
            var tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
            for (i = 0; i < s.length; i++)
                tail[i >> 2] |= s[i] << ((i % 4) << 3);
            tail[i >> 2] |= 0x80 << ((i % 4) << 3);
            if (i > 55) {
                md5cycle(state, tail);
                for (i = 0; i < 16; i++) tail[i] = 0;
            }
            tail[14] = n * 8;
            md5cycle(state, tail);
            return state;
        }

        /* there needs to be support for Unicode here,
         * unless we pretend that we can redefine the MD-5
         * algorithm for multi-byte characters (perhaps
         * by adding every four 16-bit characters and
         * shortening the sum to 32 bits). Otherwise
         * I suggest performing MD-5 as if every character
         * was two bytes--e.g., 0040 0025 = @%--but then
         * how will an ordinary MD-5 sum be matched?
         * There is no way to standardize text to something
         * like UTF-8 before transformation; speed cost is
         * utterly prohibitive. The JavaScript standard
         * itself needs to look at this: it should start
         * providing access to strings as preformed UTF-8
         * 8-bit unsigned value arrays.
         */
        function md5blk(s) { /* I figured global was faster.   */
            var md5blks = [], i; /* Andy King said do it this way. */
            for (i = 0; i < 64; i += 4) {
                md5blks[i >> 2] = s[i]
                + (s[i + 1] << 8)
                + (s[i + 2] << 16)
                + (s[i + 3] << 24);
            }
            return md5blks;
        }

        var hex_chr = '0123456789abcdef'.split('');

        function rhex(n) {
            var s = '', j = 0;
            for (; j < 4; j++)
                s += hex_chr[(n >> (j * 8 + 4)) & 0x0F]
                + hex_chr[(n >> (j * 8)) & 0x0F];
            return s;
        }

        function hex(x) {
            for (var i = 0; i < x.length; i++)
                x[i] = rhex(x[i]);
            return x.join('');
        }

        function md5(s) {
            return hex(md51(s));
        }

        function add32(a, b) {
            return (a + b) & 0xFFFFFFFF;
        }

        return md5(uint8Array);
    };
})();

1
मुझे कुल सिस्टम प्रदर्शन में दिलचस्पी है, इसलिए मेरे डेमो में xhr2 डाउनलोड और PouchDB (IDB) स्टोर शामिल हैं। आप इसे आज़मा सकते हैं और codepen.io/DrYSG/pen/kdzft पर प्रदर्शन परिणाम देख सकते हैं । मैं एक MD5 एल्गोरिथ्म व्यक्ति को देखना चाहूंगा जो कि add32 () और md5blks () फ़ंक्शन है और देखें कि क्या उन्हें बाइनरी टाइप किए गए सरणियों Uint32Array () के माध्यम से नहीं देखा जा सकता है
DrYSG

1
txt = ''वास्तव में क्या मतलब है?
मकारोव सेर्गेई

5

मैंने कई जावास्क्रिप्ट हैश कार्यान्वयनों की तुलना करने के लिए परीक्षण लिखे, जिनमें अधिकांश एमडी 5 कार्यान्वयन शामिल हैं। परीक्षणों को चलाने के लिए, http://brillout.github.io/test-javascript-hash-inforce// पर जाएं और थोड़ा इंतजार करें।

ऐसा लगता है कि आर। हिल के उत्तर का YaMD5 कार्यान्वयन सबसे तेज है।


महान बेंचमार्क के लिए धन्यवाद !! विस्तृत वर्णों के साथ YaMD5 धीमा लगता है, इसलिए मैं सामान्य उपयोग के लिए FastMD5 से चिपका रहूंगा।
अल्फोंसो निशिकावा

4

इसने मुझे परेशान कर दिया कि मुझे एक कार्यान्वयन नहीं मिला, जो कि तेज और यूनिकोड स्ट्रिंग्स दोनों का समर्थन करता है।

इसलिए मैंने एक बनाया जो यूनिकोड स्ट्रिंग्स का समर्थन करता है और अभी भी तेजी से (लेखन के समय) शो के रूप में वर्तमान में सबसे तेज़ एससी-ओनली-स्ट्रिंग्स कार्यान्वयन की तुलना में है:

https://github.com/gorhill/yamd5.js

जोसेफ मायर्स कोड के आधार पर, लेकिन टाइपेडरेज़, प्लस अन्य सुधार का उपयोग करता है।


आप के लिए यश। यह वास्तव में अभी तक केवल मैंने पाया है कि यूनिक्स सर्वर पर md5 उपयोगिता के समान सटीक हैश का उत्पादन करता है। वास्तव में अच्छा किया।
जाक

4

सिर्फ मनोरंजन के लिए,

यह एक 42 लाइनों लंबी है, 120 वर्णों में क्षैतिज रूप से फिट होती है, और अच्छी लगती है। क्या यह जल्दी है? अच्छा - यह काफी तेज है और यह लगभग सभी अन्य जेएस कार्यान्वयनों के समान है।

मुझे बस कुछ ऐसा चाहिए था जो मेरे हेल्पर्स.जेएस फ़ाइल में बदसूरत न लगे और 20-मील लंबे मिनिफ़ाइड वन-लाइनर्स के साथ मेरे सबलाइमटेक्स्ट को धीमा न करे।

तो यहाँ मेरा पसंदीदा md5 है।

//  A formatted version of a popular md5 implementation.
//  Original copyright (c) Paul Johnston & Greg Holt.
//  The function itself is now 42 lines long.

function md5(inputString) {
    var hc="0123456789abcdef";
    function rh(n) {var j,s="";for(j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;}
    function ad(x,y) {var l=(x&0xFFFF)+(y&0xFFFF);var m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);}
    function rl(n,c)            {return (n<<c)|(n>>>(32-c));}
    function cm(q,a,b,x,s,t)    {return ad(rl(ad(ad(a,q),ad(x,t)),s),b);}
    function ff(a,b,c,d,x,s,t)  {return cm((b&c)|((~b)&d),a,b,x,s,t);}
    function gg(a,b,c,d,x,s,t)  {return cm((b&d)|(c&(~d)),a,b,x,s,t);}
    function hh(a,b,c,d,x,s,t)  {return cm(b^c^d,a,b,x,s,t);}
    function ii(a,b,c,d,x,s,t)  {return cm(c^(b|(~d)),a,b,x,s,t);}
    function sb(x) {
        var i;var nblk=((x.length+8)>>6)+1;var blks=new Array(nblk*16);for(i=0;i<nblk*16;i++) blks[i]=0;
        for(i=0;i<x.length;i++) blks[i>>2]|=x.charCodeAt(i)<<((i%4)*8);
        blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks;
    }
    var i,x=sb(inputString),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda,oldb,oldc,oldd;
    for(i=0;i<x.length;i+=16) {olda=a;oldb=b;oldc=c;oldd=d;
        a=ff(a,b,c,d,x[i+ 0], 7, -680876936);d=ff(d,a,b,c,x[i+ 1],12, -389564586);c=ff(c,d,a,b,x[i+ 2],17,  606105819);
        b=ff(b,c,d,a,x[i+ 3],22,-1044525330);a=ff(a,b,c,d,x[i+ 4], 7, -176418897);d=ff(d,a,b,c,x[i+ 5],12, 1200080426);
        c=ff(c,d,a,b,x[i+ 6],17,-1473231341);b=ff(b,c,d,a,x[i+ 7],22,  -45705983);a=ff(a,b,c,d,x[i+ 8], 7, 1770035416);
        d=ff(d,a,b,c,x[i+ 9],12,-1958414417);c=ff(c,d,a,b,x[i+10],17,     -42063);b=ff(b,c,d,a,x[i+11],22,-1990404162);
        a=ff(a,b,c,d,x[i+12], 7, 1804603682);d=ff(d,a,b,c,x[i+13],12,  -40341101);c=ff(c,d,a,b,x[i+14],17,-1502002290);
        b=ff(b,c,d,a,x[i+15],22, 1236535329);a=gg(a,b,c,d,x[i+ 1], 5, -165796510);d=gg(d,a,b,c,x[i+ 6], 9,-1069501632);
        c=gg(c,d,a,b,x[i+11],14,  643717713);b=gg(b,c,d,a,x[i+ 0],20, -373897302);a=gg(a,b,c,d,x[i+ 5], 5, -701558691);
        d=gg(d,a,b,c,x[i+10], 9,   38016083);c=gg(c,d,a,b,x[i+15],14, -660478335);b=gg(b,c,d,a,x[i+ 4],20, -405537848);
        a=gg(a,b,c,d,x[i+ 9], 5,  568446438);d=gg(d,a,b,c,x[i+14], 9,-1019803690);c=gg(c,d,a,b,x[i+ 3],14, -187363961);
        b=gg(b,c,d,a,x[i+ 8],20, 1163531501);a=gg(a,b,c,d,x[i+13], 5,-1444681467);d=gg(d,a,b,c,x[i+ 2], 9,  -51403784);
        c=gg(c,d,a,b,x[i+ 7],14, 1735328473);b=gg(b,c,d,a,x[i+12],20,-1926607734);a=hh(a,b,c,d,x[i+ 5], 4,    -378558);
        d=hh(d,a,b,c,x[i+ 8],11,-2022574463);c=hh(c,d,a,b,x[i+11],16, 1839030562);b=hh(b,c,d,a,x[i+14],23,  -35309556);
        a=hh(a,b,c,d,x[i+ 1], 4,-1530992060);d=hh(d,a,b,c,x[i+ 4],11, 1272893353);c=hh(c,d,a,b,x[i+ 7],16, -155497632);
        b=hh(b,c,d,a,x[i+10],23,-1094730640);a=hh(a,b,c,d,x[i+13], 4,  681279174);d=hh(d,a,b,c,x[i+ 0],11, -358537222);
        c=hh(c,d,a,b,x[i+ 3],16, -722521979);b=hh(b,c,d,a,x[i+ 6],23,   76029189);a=hh(a,b,c,d,x[i+ 9], 4, -640364487);
        d=hh(d,a,b,c,x[i+12],11, -421815835);c=hh(c,d,a,b,x[i+15],16,  530742520);b=hh(b,c,d,a,x[i+ 2],23, -995338651);
        a=ii(a,b,c,d,x[i+ 0], 6, -198630844);d=ii(d,a,b,c,x[i+ 7],10, 1126891415);c=ii(c,d,a,b,x[i+14],15,-1416354905);
        b=ii(b,c,d,a,x[i+ 5],21,  -57434055);a=ii(a,b,c,d,x[i+12], 6, 1700485571);d=ii(d,a,b,c,x[i+ 3],10,-1894986606);
        c=ii(c,d,a,b,x[i+10],15,   -1051523);b=ii(b,c,d,a,x[i+ 1],21,-2054922799);a=ii(a,b,c,d,x[i+ 8], 6, 1873313359);
        d=ii(d,a,b,c,x[i+15],10,  -30611744);c=ii(c,d,a,b,x[i+ 6],15,-1560198380);b=ii(b,c,d,a,x[i+13],21, 1309151649);
        a=ii(a,b,c,d,x[i+ 4], 6, -145523070);d=ii(d,a,b,c,x[i+11],10,-1120210379);c=ii(c,d,a,b,x[i+ 2],15,  718787259);
        b=ii(b,c,d,a,x[i+ 9],21, -343485551);a=ad(a,olda);b=ad(b,oldb);c=ad(c,oldc);d=ad(d,oldd);
    }
    return rh(a)+rh(b)+rh(c)+rh(d);
}

लेकिन वास्तव में, मैंने इसे केवल सौंदर्यवादी विचारों से बाहर रखा है। इसके अलावा, टिप्पणियों के साथ यह बिल्कुल 4000 बाइट्स है। कृपया पूछें क्यों नहीं। मैं अपने ओसीडी / विद्रोही व्यवहार के लिए उचित स्पष्टीकरण नहीं दे सकता। इसके अलावा, पॉल जॉनसन को धन्यवाद, ग्रेग होल्ट को धन्यवाद। (साइड नोट: आप लोग कुछ var कीवर्ड छोड़ चुके हैं, इसलिए मैंने उन्हें जोड़ने की स्वतंत्रता ले ली है।)


@dkelner कूल। मैं अपने ऐप में उपयोग करने के लिए अपने फ़ंक्शन को कॉपी / पेस्ट करना चाहता हूं। कृपया आप एक लाइसेंस दे सकते हैं
pinoyyid

कोई ज़रूरत नहीं है, यह उपयोग करने के लिए बिल्कुल मुफ्त है, यह एक और नि: शुल्क कार्यान्वयन से प्राप्त काम है। तो बस इसका उपयोग करें और शायद लेखकों की तरह टिप्पणी करें जैसे मैंने किया।
dkellner

3

Node.js ने अंतर्निहित समर्थन किया है

const crypto = require('crypto')
crypto.createHash('md5').update('hello world').digest('hex')

कोड स्निपेट ऊपर स्ट्रिंग के लिए एमडी 5 हेक्स स्ट्रिंग की गणना करता है hello world

इस समाधान का लाभ यह है कि आपको अतिरिक्त पुस्तकालय स्थापित करने की आवश्यकता नहीं है।

मुझे लगता है कि समाधान में निर्मित सबसे तेज होना चाहिए। यदि नहीं, तो हमें Node.js प्रोजेक्ट के लिए समस्या / PR बनाना चाहिए।


1

js-md5 UTF-8 स्ट्रिंग, सरणी, ArrayBuffer, AMD का समर्थन करता है ...।

और तेज। jsperf


1

शायद यह पैकेज उपयोगी था
https://www.npmjs.com/package/pure-md5

console.time('latin');
const latin = md5('hello');
console.timeEnd('latin');

console.log('Привет: ', md5('Привет'));
console.log('嘿: ', md5('嘿'));
<script src="https://unpkg.com/pure-md5@latest/lib/index.js"></script>


0

Http://phpjs.org/functions/md5/ क्यों न करें ?

दुर्भाग्य से प्रदर्शन किसी भी अनुकरणीय स्क्रिप्ट के साथ सीमित है, हालांकि यह वास्तविक md5 हैश को प्रस्तुत कर सकता है। यद्यपि मैं पासवर्ड के लिए md5 का उपयोग करने के खिलाफ सलाह दूंगा, क्योंकि यह एक तेजी से प्रदान की जाने वाली हैश है।


0

ग्राफिक कार्ड (वेबलॉग में हैशिंग एल्गोरिथ्म को लागू करना) पर गणना करके बहुत तेज़ हैशिंग संभव हो सकता है, जैसा कि SHA256 के बारे में चर्चा की गई: क्या उपयोगकर्ता के वीडियो कार्ड का उपयोग करके ब्राउज़र में sha256 हैश की गणना करना संभव है, जैसे। WebGL या फ़्लैश का उपयोग करके?


-3

आप मेरे md5 कार्यान्वयन की जांच भी कर सकते हैं । यह लगभग होना चाहिए। जैसा कि ऊपर पोस्ट किया गया है। दुर्भाग्य से, प्रदर्शन आंतरिक लूप द्वारा सीमित है जो अधिक अनुकूलन करना असंभव है।


-4

यदि आपके आवेदन का प्रदर्शन एमडी 5 के जावास्क्रिप्ट कार्यान्वयन द्वारा सीमित है, तो आप वास्तव में कुछ गलत कर रहे हैं। एक वास्तु परिवर्तन पर विचार करें (संकेत: एमडी 5 का उपयोग अक्सर कम करें)


3
जेएस के साथ एक "देशी" अनुप्रयोग में एमडी 5 का उपयोग नहीं कर रहा हूँ, इसका ऑनलाइन एमडी 5 चेक टूल: bruechner.de/md5file/js अब एमडी 5 के लिए मूल एप्लिकेशन की कोई आवश्यकता नहीं है;)
powtac
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.