JavaScript'te en hızlı MD5 Uygulaması


236

Orada birçok MD5 JavaScript uygulaması var. Hangisinin en gelişmiş, en çok düzeltilmiş ve en hızlı olduğunu bilen var mı?

Bu araç için ihtiyacım var .


2
Neden "hızlı" bir MD5 uygulamasına ihtiyacınız var?
AnthonyWJones

3
@AnthonyWJones başka herhangi bir md5 işlevine ihtiyaç var mı? Bir "yavaş" md5 işlevi gerçekten herhangi bir amaca hizmet gibi değil .. değil mi?
Lee Olayvar

5
@LeeOlayvar Bir şifreleme işlevi ne kadar yavaş olursa, o işlevi kullanarak belirli bir karmayı kaba kuvvetlendirmek o kadar uzun sürer.
Mathias Bynens

45
@MathiasBynens Evet, ancak tasarım gereği md5 hızlı bir karmadır. Yani, büyük miktarda veri tüketmek ve çok, çok hızlı bir karma çıkarmak için tasarlanmıştır. Bu, aslında şifreler / vb. Gibi güvenli verileri saklamak için istediğiniz son şeydir ve verileri tanımlamak için daha uygundur / tasarlanmıştır . Öte yandan yavaş hashler, sıfırdan yavaş olacak şekilde tasarlanmıştır. Brute, büyük bir çalışma değerine sahip yavaş bir karmayı zorlamak kolay bir iş değildir. Bu nedenle, yavaş karmalar parolalar için idealdir. MD5, çoğu durumda (çoğu?) Şifreler için kötüdür. Bu alanda uzman değilim, bu yüzden bunu tuzla alın. :)
Lee Olayvar

16
Bir bulunduğundan Evet, ama Spec görev MD5 hash görünüyor ne gibi olduğunu, bu hızlı veya yavaş hesaplayabilir olmadığını önemli değil. Sonuç aynıdır ve kaba kuvvetle eşit derecede zor / kolay olacaktır. O yüzden yapar mantıklı en hızlı uygulanmasını kullanmak.
Stijn de Witt

Yanıtlar:


168

Joseph'in Myers uygulamasının oldukça hızlı olduğunu duydum. Ek olarak, Javascript optimizasyonu hakkında, uygulamasını yazarken öğrendiklerini açıklayan uzun bir makalesi var. Performans javascript ile ilgilenen herkes için iyi bir okuma.

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

MD5 uygulaması burada bulunabilir


123
"JavaScript MD5 kodumu herkesten daha hızlı hale getirmek için yerel işlev değişkenlerinden yararlanmak zorunda kaldım." Ne büyük bir atılım!
Glenn Maynard

11
Bu md5 kütüphanesinin bir gösterisini burada bulabilirsiniz: jsfiddle.net/v28gq
Anderson Green

15
Myers kodunun lisansı nedir? Anlayabildiğim kadarıyla web sitesinde lisanslı olduğunu (veya olmadığını) belirtmez.
JeroenHoek

25
Bu uygulama bir sürü küresel işlevler oluşturuyor beni rahatsız ediyor, bu yüzden her şeyi bir kapanışta tamamladım, her işlevi bir değişken haline getirdim ve md5 işlevini pencere nesnesine atadım. Bu açıkça bir pencere nesnesi olduğunu varsayar, ancak tüm destekleyici işlevleri gizli tutacaktır. Bunun performansı nasıl etkileyeceğinden emin değilim, ancak büyük uygulamalarda kullanım için daha güvenli olmalıdır. gist.github.com/jhoff/7680711
jhoff

6
@jhoff Gist'iniz birkaç kez çatallandı ve geliştirildi, aynı zamanda var add32on line 185'in de olması gerektiğini düşünüyorum, bu add32yüzden yapabileceğim en iyi çatalı buldum ve bu yeni sürüme güncelledim: gist.github.com/MichaelPote/3f0cefaaa9578d7e30be
Mikepote

73

Bu durumda CryptoJS kullanmanızı öneririm.

Temel olarak CryptoJS, JavaScript'te en iyi uygulamalar ve kalıplar kullanılarak uygulanan standart ve güvenli kriptografik algoritmaların büyüyen bir koleksiyonudur. Hızlıdırlar ve tutarlı ve basit bir arayüze sahiptirler.

Parola dizenizin MD5 karmasını hesaplamak istiyorsanız, aşağıdaki işlemleri yapın:

<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>

Böylece bu komut dosyası, şifre dizenizin karmasını sunucuya gönderir.

Diğer karma hesaplama algoritmaları hakkında daha fazla bilgi ve destek için ziyaret edebilirsiniz:

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


59
Parolalar için md5 kullanmamalısınız.
Lukas Liesis

3
Görünüşe göre bu çok geçmeden yetim kalacak, yine de "google kodu" nda. Kimse bakmıyor mu?
MrYellow

2
md5 hızlı ve birisi sitenizi çatlak ve db & kodu sızdırılmış her zaman hashes ile db oluşturabilir ve şifreleri çözmek. Canlı veritabanınızı 10M kullanıcı koduyla verin. Bununla eğleneceğim ve çözülen sonuçlarımı internete göndereceğim. Şerefe.
Lukas Liesis

2
Bağlantı şimdi bir 404 Sayfasına götürüyor
Adam F


29

Kütüphane seçerken, Bower gibi modern çerçeveleri destekleyip desteklemediğini, jslint'i geçip geçmediğini, JQuery için eklenti modelini veya AMD / RequireJS gibi modül sistemlerini aktif olarak geliştirmenin yanı sıra 1'den fazla katılımcıya sahip olup olmadığını görmek de önemlidir. Bu ek kriterlerin bir kısmını veya tamamını karşılayan birkaç seçenek vardır:

  • CryptoJS : Bu, belki de her algoritmanın JS kodunuza yağ eklemeden ayrı olarak kullanılabileceği en geniş kütüphanedir. Ayrıca UTF8, UTF16 ve Base64 için kodlayıcı / kod çözücü olarak. Ben korumak github depo Bower paketiyle artı RequireJS ile kullanmak hakkında talimatlar olarak tescil edilmiştir.
  • Spark MD5 : Bu, diğer yanıtların da bahsettiği JKM koduna dayanmaktadır ve bu da daha hızlı bir uygulamadır. Bununla birlikte, Spark uygulaması AMD desteğini ekler, jslint plus'ın artımlı moduna geçer. Base64 o / p'ye sahip değildir, ancak ham o / p'ye sahiptir (yani dize yerine 32 bit int dizisi).
  • JQuery MD5 eklentisi : Yeryüzüne çok basit ama ham mod yok gibi görünüyor.
  • JavaScript-MD5 : Spark kadar süslü veya hızlı değil, daha basit.

CryptoJS'den bir örnek:

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

Yukarıdaki kütüphaneler arasında http://jsperf.com/md5-shootout/7 adresinde bir performans karşılaştırması vardır . Makinemde mevcut testler (kuşkusuz eskidir), hız arıyorsanız, Spark MD5 en iyi bahistir (ve aynı zamanda düz JKM kodu). Ancak daha kapsamlı bir kütüphane arıyorsanız, Spark MD5'ten% 79 daha yavaş olmasına rağmen CryptoJS sizin için en iyi seçenektir. Ancak CryptoJS'nin biraz daha aktif bir projeyle aynı hıza ulaşacağını düşünürdüm.


"JQuery MD5 eklentisi" bağlantısı beni kötü amaçlı bir siteye yönlendiriyor. Eep!
Raffi

1
Görünüşe göre jQuery MD5 eklentisi için orijinal web sitesi kapatıldı ve şimdi genel alan satıcısına yönlendiriyor. Şimdi GitHub'da barındırılan eklentiye güncelledim.
Shital Shah

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>


ancak en hızlı uygulama bu gibi görünüyor: myersdaily.org/joseph/javascript/jkm-md5.js
Zibri

bu bağlantı çalışmıyor myersdaily.org/joseph/javascript/jkm-md5.js
Giggs

@ Giggs sadece google kullanıyor ve bulacaksınız: pajhome.org.uk/crypt/md5/contrib/jkm-md5.js
Zibri



5

Sadece yazılan dizileri (DataView, ArrayBuffer, vb.) Destekleyen HTML5 tarayıcıları desteklemek gerekir Ben Joseph Myers kodunu aldı ve bir Uint8Array geçen destek için değiştirildi düşünüyorum. Tüm geliştirmeleri yakalamadım ve hala muhtemelen üzerinde geliştirilebilecek bazı char () dizi eserler var. PouchDB projesine eklemek için buna ihtiyacım vardı.

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
Toplam sistem performansı ile ilgileniyorum, bu yüzden demo xhr2 indirmeleri ve PouchDB (IDB) mağazalarını içeriyor. Deneyin ve performans sonuçlarını codepen.io/DrYSG/pen/kdzft adresinde görebilirsiniz . Ne bir MD5 algoritması kişi bakmak istiyorum add32 () ve md5blks () fonksiyonları ve ikili tipli diziler tarafından sped up olup olmadığını görmek Uint32Array ()
Dr.YSG

1
txt = ''Aslında ne anlama geliyor?
Makarov Sergey

5

Burada bahsedilen çoğu MD5 uygulaması da dahil olmak üzere birkaç JavaScript karma uygulamasını karşılaştırmak için testler yazdım. Testleri yapmak için http://brillout.github.io/test-javascript-hash-implementations/ adresine gidin ve biraz bekleyin.

Görünüşe göre, R. Hill'in cevabının YaMD5 uygulaması en hızlısı.


Büyük kriter için teşekkür ederim !! Geniş karakterli YaMD5 yavaş görünüyor, bu yüzden genel kullanım için FastMD5'e bağlı kalacağım.
Alfonso Nishikawa

4

Hem hızlı hem de Unicode dizelerini destekleyen bir uygulama bulamadığım beni rahatsız etti.

Bu yüzden Unicode dizelerini destekleyen ve hala şu anda en hızlı ascii dizeleri uygulamalarından daha hızlı (yazma sırasında) gösteren bir tane yaptım :

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

Joseph Myers'in koduna dayanır, ancak TypedArrays ve diğer geliştirmeleri kullanır.


Size şükran. Bu aslında şimdiye kadar bir Unix sunucusunda md5 yardımcı programı ile tam olarak aynı karma verir bulundu. Gerçekten aferin.
Jacques

4

Sadece eğlence için,

bu 42 satır uzunluğunda, yatay olarak 120 karaktere sığar ve iyi görünür. Hızlı mı? Yeterince hızlı ve yaklaşık olarak diğer tüm JS uygulamaları ile aynı.

Sadece helpers.js dosyamda çirkin görünmeyen ve SublimeText'imi 20 mil uzunluğunda küçültülmüş tek gömleklerle yavaşlatmayan bir şey istedim .

İşte benim en sevdiğim 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);
}

Ama gerçekten, sadece estetik kaygılardan bahsetmiştim. Ayrıca, yorumlarla tam olarak 4000 byte. Lütfen nedenini sorma. OKB / isyancı davranışım için uygun bir açıklama bulamıyorum. Ayrıca teşekkür ederim Paul Johnston, teşekkür ederim Greg Holt. (Yan not: siz birkaç var anahtar kelimeyi atladınız, bu yüzden onları ekleme özgürlüğünü aldım.)


@dkelner Havalı. Uygulamamda kullanmak için işlevinizi kopyalamak / yapıştırmak istiyorum. Lütfen bir lisans verebilir misiniz
pinoyyid

Gerek yok, kullanımı tamamen ücretsiz, başka bir ücretsiz uygulamadan türetilmiş bir çalışma. Bu yüzden sadece kullanın ve belki de benim gibi yazarları yorumlayın.
dkellner

3

Node.js yerleşik desteğe sahiptir

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

Yukarıdaki kod snippet'i, dize için MD5 hex dizesini hesaplar hello world

Bu çözümün avantajı, ek kitaplık kurmanıza gerek olmamasıdır.

Bence yerleşik çözüm en hızlı olmalı. Değilse, Node.js projesi için issue / PR oluşturmalıyız.



1

Belki bu paket yararlıydı
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

Neden http://phpjs.org/functions/md5/ adresini denemiyorsunuz? ?

Ne yazık ki performans öykünülen herhangi bir komut dosyasıyla sınırlıdır, ancak bu gerçek md5 karma değerini oluşturabilir. Her ne kadar hızlı render hash olduğu için şifreler için md5 kullanmaya karşı tavsiye ediyorum.



-3

Ayrıca md5 uygulamamı da kontrol edebilirsiniz . Yakl. yukarıda yayınlanan diğer ile aynı. Ne yazık ki, performans daha fazla optimize etmek imkansız olan iç döngü ile sınırlıdır.


-4

Uygulamanızın performansı MD5'in Javascript uygulamasıyla sınırlıysa, gerçekten yanlış bir şey yapıyorsunuz demektir. Mimari bir değişiklik düşünün (İpucu: MD5'i daha az kullanın)


3
Im JS ile bir "yerli" uygulamada MD5 kullanmıyorum, onun bir çevrimiçi MD5 kontrol aracı: bruechner.de/md5file/js artık MD5 için yerli app gerek yok;)
powtac
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.