জাভাস্ক্রিপ্টে দ্রুততম MD5 বাস্তবায়ন


236

অনেক MD5 জাভাস্ক্রিপ্ট বাস্তবায়ন আছে। কেউ কি জানে যে কোনটি সবচেয়ে উন্নত, সবচেয়ে বাগফিক্সড এবং দ্রুত?

এই সরঞ্জামটির জন্য আমার এটি দরকার ।


2
আপনার কেন "দ্রুত" এমডি 5 বাস্তবায়ন প্রয়োজন?
অ্যান্থনিডাব্লু জোন্স

3
@ অ্যান্থনিডব্লু জোন্সকে কি অন্য কোনও ধরণের এমডি 5 ফাংশনের প্রয়োজন আছে? এটি "ধীর" এমডি 5 ফাংশনটির মতো নয় যা সত্যিই কোনও উদ্দেশ্য করে .. এটি কি করে?
লি ওল্যাভার

5
@ লিওলাইভার একটি ক্রিপ্টোগ্রাফি ফাংশন যত ধীরে ধীরে ততক্ষণ এই ফাংশনটি ব্যবহার করে প্রদত্ত হ্যাশটিকে ছাঁটাইতে আরও বেশি সময় লাগবে।
ম্যাথিয়াস বাইনেনস

45
@ ম্যাথিয়াসবাইনেন্স হ্যাঁ তবে ডিজাইন অনুসারে, এমডি 5 একটি দ্রুত হ্যাশ। এটি বলার অপেক্ষা রাখে না যে এটি প্রচুর পরিমাণে ডেটা ব্যবহার এবং খুব দ্রুত খুব দ্রুত একটি হ্যাশ আউটপুট করার জন্য ডিজাইন করা হয়েছে। এটি সুরক্ষিত ডেটা যেমন পাসওয়ার্ড / ইত্যাদি সংরক্ষণের জন্য আপনি সর্বশেষে চাই এবং এটি ডেটা সনাক্তকরণের জন্য আরও উপযুক্ত / উপযুক্ত designed অন্যদিকে ধীর হ্যাশগুলি গ্রাউন্ড আপ থেকে ধীর হয়ে যাওয়ার জন্য ডিজাইন করা হয়েছে। বৃহত কাজের মান সহ ধীর হ্যাশ জোর করা সহজ কাজ নয়। যেমন, ধীর হ্যাশগুলি পাসওয়ার্ডের জন্য আদর্শ। MD5 অনেকগুলি (সর্বাধিক?) ক্ষেত্রে পাসওয়ার্ডের জন্য খারাপ। আমি এই ক্ষেত্রের বিশেষজ্ঞ নই, তাই এটি লবণ দিয়ে নিন। :)
লি ওল্যাভর

16
হ্যাঁ, কিন্তু সেখানে একটি হল বৈশিষ্ট ম্যান্ডেট একটি MD5 হ্যাশ দেখে মনে হচ্ছে কি যে, তাই না ব্যাপার কিনা এটি দ্রুত বা ধীরে ধীরে গনা আছে। শেষ ফলাফলটি একই এবং ফলস্বরূপ শক্তিশালী করা সহজ / সমান হবে। সুতরাং এটি দ্রুততম বাস্তবায়নটি ব্যবহার করার জন্য অর্থবোধ করে না।
স্টিজন ডি উইট

উত্তর:


168

আমি শুনেছি জোসেফের মাইয়ার্স বাস্তবায়ন বেশ দ্রুত। অতিরিক্তভাবে, জাভাস্ক্রিপ্ট অপ্টিমাইজেশনে তাঁর একটি দীর্ঘ নিবন্ধ রয়েছে যা তার বাস্তবায়ন লেখার সময় তিনি কী শিখেছিলেন তা বর্ণনা করে। পারফরম্যান্ট জাভাস্ক্রিপ্টে আগ্রহী প্রত্যেকের জন্য এটি ভাল পড়া।

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

তার MD5 বাস্তবায়ন এখানে পাওয়া যাবে


123
"আমার জাভাস্ক্রিপ্ট এমডি 5 কোডটি সকলের চেয়ে দ্রুততর করার জন্য, আমাকে স্থানীয় ফাংশন ভেরিয়েবলগুলির সুবিধা নিতে হয়েছিল।" কি এক যুগান্তকারী!
গ্লেন মেইনার্ড

11
এই এমডি 5 গ্রন্থাগারের একটি প্রদর্শন এখানে পাওয়া যাবে: jsfiddle.net/v28gq
অ্যান্ডারসন গ্রীন

15
মাইয়ার্স কোডের লাইসেন্স কী? আমি এটি যতদূর বলতে পারি তার ওয়েবসাইটে এটি লাইসেন্সড (বা না) ইঙ্গিত দেয় না।
জেরোইনহোক

25
এটি আমাকে বিরক্ত করে যে এই প্রয়োগটি বিশ্বব্যাপী ফাংশনগুলির একটি গোছা তৈরি করে, তাই আমি পুরো জিনিসটিকে একটি বন্ধে আবৃত করে রেখেছি, প্রতিটি ফাংশনকে একটি পরিবর্তনশীল করে দিয়েছি এবং উইন্ডো অবজেক্টে এমডি 5 ফাংশন নির্ধারণ করেছি। এটি স্পষ্টতই ধরে নিচ্ছে যে কোনও উইন্ডো অবজেক্ট রয়েছে তবে এটি সমর্থনকারী সমস্ত কার্য ব্যক্তিগত রাখবে। আমি নিশ্চিত না (কীভাবে তবে) এটি পারফরম্যান্সকে কীভাবে প্রভাবিত করবে, তবে বৃহত অ্যাপ্লিকেশনগুলিতে এটি ব্যবহারের জন্য আরও নিরাপদ হওয়া উচিত। gist.github.com/jhoff/7680711
jhoff

6
@ জফফ আপনার গিস্টটি কয়েকবার কাঁটাচামচ করা হয়েছে এবং উন্নত হয়েছে, আমিও মনে করি যে var add32185 লাইনটি ঠিক হওয়া উচিত add32তাই আমি খুঁজে পেলাম সেরা কাঁটাচামড়াটি এবং এই নতুন সংস্করণে এটি আপডেট করেছি: gist.github.com/MichaelPote/3f0cefaaa9578d7e30be
মাইকপোট

73

আমি আপনাকে এই ক্ষেত্রে ক্রিপ্টোজেএস ব্যবহার করার পরামর্শ দেব।

মূলত ক্রিপ্টোজেএস সেরা অনুশীলন এবং নিদর্শন ব্যবহার করে জাভাস্ক্রিপ্টে প্রয়োগ করা স্ট্যান্ডার্ড এবং সুরক্ষিত ক্রিপ্টোগ্রাফিক অ্যালগরিদমের একটি ক্রমবর্ধমান সংগ্রহ। তারা দ্রুত, এবং তাদের একটি সামঞ্জস্যপূর্ণ এবং সহজ ইন্টারফেস রয়েছে।

সুতরাং আপনি যদি নিজের পাসওয়ার্ডের স্ট্রিংয়ের MD5 হ্যাশ গণনা করতে চান তবে নীচে হিসাবে করুন:

<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
আপনার পাসওয়ার্ডের জন্য এমডি 5 ব্যবহার করা উচিত নয়।
লুকাশ লিসিস

3
দেখে মনে হচ্ছে এটি অনেক আগেই অনাথ হবে, এখনও "গুগল কোড" এ। কেউ রক্ষণ করছেন না?
মিঃইলো

2
এমডি 5 দ্রুত এবং যদি কেউ আপনার সাইটের ক্র্যাক করে এবং আপনার ডিবি & কোড ফাঁস হয় আপনি সর্বদা হ্যাশ এবং ডিকোড পাসওয়ার্ড সহ ডিবি তৈরি করতে পারেন। আমাকে 10 এম ব্যবহারকারী এবং কোড সহ আপনার লাইভ ডাটাবেসটি দিন। আমি এটির সাথে মজা করব এবং আমার ডিকোড হওয়া ফলাফলগুলি ইন্টারনেটে পোস্ট করব। চিয়ার্স।
লুকাশ লিসিস

2
লিঙ্কটি এখন 404 পৃষ্ঠাতে
অ্যাডাম এফ


29

লাইব্রেরি নির্বাচন করার সময় এটি দেখতেও গুরুত্বপূর্ণ যে এটি আধুনিক ফ্রেমওয়ার্ক যেমন বোভার, জেসলিন্ট পাস করে, সক্রিয় বিকাশে থাকার সাথে সাথে এএমডি / রিকোয়ারডেজেএস এর মতো জেউকিরির মডিউল সিস্টেম বা মডিউল সিস্টেমগুলিকে সমর্থন করে এবং 1 টিরও বেশি অবদানকারী রয়েছে কিনা তা দেখার দরকার। কয়েকটি বিকল্প রয়েছে যা কিছু বা এই সমস্ত অতিরিক্ত মানদণ্ডকে সন্তুষ্ট করে:

  • ক্রিপ্টোজেএস : এটি সম্ভবত সর্বাধিক বিস্তৃত গ্রন্থাগার যেখানে আপনার জেএস কোডে ফ্যাট যোগ না করে প্রতিটি অ্যালগরিদম পৃথকভাবে ব্যবহার করা যেতে পারে। এটি ইউটিএফ 8, ইউটিএফ 16 এবং বেস 64 এর জন্য এনকোডার / ডিকোডার হিসাবে যুক্ত করুন। আমি গিথুব সংগ্রহস্থলটি বজায় রাখি যা বোর প্যাকেজ হিসাবে নিবন্ধিত রয়েছে এবং এটি প্রয়োজনীয় জেএস এর সাথে কীভাবে ব্যবহার করতে হয় তার নির্দেশাবলী।
  • স্পার্ক এমডি 5 : এটি জে কেএম কোডের উপর ভিত্তি করে অন্যান্য উত্তর উল্লেখ করেছে যা দ্রুত বাস্তবায়নও। তবে এ ছাড়াও, স্পার্ক বাস্তবায়ন এএমডি সমর্থন যোগ করে, জেসলিন্ট প্লাস পাস করে ইনক্রিমেন্টাল মোড। এটিতে বেস 64 ও / পি নেই তবে এতে কাঁচা ও / পি রয়েছে (অর্থাত্ স্ট্রিংয়ের 32 বিট ইন্ট ইনস্যাডের অ্যারে)।
  • জিকুয়েরি এমডি 5 প্লাগইন : পৃথিবীতে খুব সহজ তবে কাঁচা মোডে মনে হয় না।
  • জাভাস্ক্রিপ্ট-এমডি 5 : স্পার্কের মতো অভিনব বা দ্রুত নয় তবে সহজ।

ক্রিপ্টোজেএস থেকে উদাহরণ:

//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 আপনার সেরা বাজি (এবং এটি সাধারণ জেএমএম কোড)। তবে আপনি যদি আরও বিস্তৃত লাইব্রেরি খুঁজছেন তবে ক্রিপ্টোজেএস আপনার সেরা বেট যদিও এটি স্পার্ক এমডি 5 এর চেয়ে 79% ধীর। তবে আমি কল্পনা করব ক্রিপ্টোজেএস শেষ পর্যন্ত একই গতি অর্জন করবে যেমন এটি কিছুটা সক্রিয় প্রকল্প।


"JQuery MD5 প্লাগইন" এর লিঙ্কটি আমাকে একটি ম্যালওয়ার সাইটে নিয়ে যায়। EEP!
রাফি 21

1
দেখে মনে হচ্ছে jQuery MD5 প্লাগইনটির মূল ওয়েবসাইটটি বন্ধ হয়ে গেছে এবং এটি এখন জেনেরিক ডোমেন বিক্রেতাকে পুনঃনির্দেশ করে। আমি এখন গিটহাবে হোস্ট করা প্লাগইন আপডেট করেছি।
শীতল শাহ

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-Soutout কিছু পরীক্ষা করুন

চূড়ান্ত গতির জন্য আমার সন্ধানে আমি এই কোডটি দেখলাম, আমি দেখেছি এটি আরও উন্নত হতে পারে। সুতরাং আমি জোসেফ মেয়ার্স কোডের উপর ভিত্তি করে একটি নতুন জেএস স্ক্রিপ্ট তৈরি করেছি।

দেখতে উন্নত Jospeh মায়ার্স কোড


11
কেন এটি কাঁটাবেন, কেবল আপনার প্যাচটিকে পুনরায় রক্ষণাবেক্ষণকারীর কাছে জমা দেওয়ার পরিবর্তে?
নিক জেনিংস


5

আমাকে কেবল এইচটিএমএল 5 ব্রাউজারগুলি সমর্থন করতে হবে যা টাইপ করা অ্যারেগুলিকে সমর্থন করে (ডেটাভিউ, অ্যারেবফার, ইত্যাদি) আমার মনে হয় আমি জোসেফ মাইয়ার্স কোডটি নিয়েছি এবং এটি কোনও ইউন্ট 8 অ্যারে পাসিং সমর্থন করার জন্য এটি সংশোধন করেছি। আমি সমস্ত উন্নতিটি ধরতে পারি নি এবং সম্ভবত এখনও কিছু চর () অ্যারে শৈলী রয়েছে যা উন্নত করা যেতে পারে। পাউচডিবি প্রকল্পে যুক্ত করার জন্য আমার এটি দরকার ছিল।

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
আমি মোট সিস্টেমের পারফরম্যান্সে আগ্রহী, সুতরাং আমার ডেমোতে এক্সএইচআর 2 ডাউনলোড এবং পাউচডিবি (আইডিবি) স্টোর অন্তর্ভুক্ত রয়েছে। আপনি এটি চেষ্টা করে দেখতে পারেন এবং কোডেপেন.ইও / ডিআরওয়াইএসজি / স্পেন / কেডিজেফ্টে পারফরম্যান্সের ফলাফলগুলি দেখতে পারেন । আমি কি একটি MD5 অ্যালগরিদম ব্যক্তি তাকান চাই add32 () এবং md5blks () ফাংশন এবং দেখ যদি তারা বাইনারি টাইপ অ্যারে Uint32Array () গতি আনে করা যাবে না
Dr.YSG

1
কি txt = ''আসলে এর অর্থ কি?
ম্যাকারভ সের্গেই

5

আমি এখানে উল্লেখ করা বেশিরভাগ এমডি 5 বাস্তবায়ন সহ বেশ কয়েকটি জাভাস্ক্রিপ্ট হ্যাশ বাস্তবায়নের তুলনা করার জন্য পরীক্ষাগুলি লিখেছি। পরীক্ষা চালাতে, http://brillout.github.io/test-javascript-hash-implementations/ এ যান এবং কিছুটা অপেক্ষা করুন।

দেখে মনে হচ্ছে যে আর। হিলের উত্তরটির YaMD5 বাস্তবায়ন সবচেয়ে দ্রুত।


দুর্দান্ত মানদণ্ডের জন্য আপনাকে ধন্যবাদ! প্রশস্ত অক্ষর সহ YaMD5 ধীর বলে মনে হচ্ছে, তাই আমি জেনেরিক ব্যবহারের জন্য ফাস্টএমডি 5 তে লেগে থাকব।
আলফোনসো নিশিকাওয়া

4

এটি আমাকে বিরক্ত করেছিল যে আমি এমন একটি বাস্তবায়ন পাইনি যা দ্রুত এবং ইউনিকোড স্ট্রিং উভয় সমর্থন করে।

সুতরাং আমি এমন একটি তৈরি করেছি যা ইউনিকোড স্ট্রিংগুলিকে সমর্থন করে এবং বর্তমানে দ্রুততম এসকিআই-স্ট্রিং বাস্তবায়নগুলির চেয়ে দ্রুত (লেখার সময়) দেখায় :

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

জোসেফ মাইয়ার্স কোডের উপর ভিত্তি করে, তবে টাইপড অ্যারেগুলি, এবং অন্যান্য উন্নতি ব্যবহার করে।


আপনাকে কুডোস এটি আসলে এখনও আমি খুঁজে পেয়েছি যে ইউনিক্স সার্ভারে এমডি 5 ইউটিলিটি হিসাবে ঠিক একই হ্যাশটি পাওয়া যায়। সত্যিই ভাল কাজ।
জ্যাকস

4

শুধুই মজার জন্য,

এটি একটি 42 লাইন দীর্ঘ, 120 অক্ষরে অনুভূমিকভাবে ফিট করে এবং দেখতে দুর্দান্ত looks এটা কি দ্রুত? ভাল - এটি যথেষ্ট দ্রুত এবং এটি অন্যান্য জেএস বাস্তবায়নের মতো প্রায় একই।

আমি কেবল এমন কিছু চেয়েছিলাম যা আমার হেল্পার্স.জেএস ফাইলগুলিতে কুশ্রী লাগে না এবং 20 মাইল দীর্ঘ মিনিডযুক্ত ওয়ান-লাইনারগুলির সাথে আমার সাব্লাইমেক্সটকে ধীর করে না।

সুতরাং এখানে আমার প্রিয় এমডি 5।

//  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 বাইট। কেন জিজ্ঞাসা করবেন না। আমি আমার ওসিডি / বিদ্রোহী আচরণের জন্য সঠিক ব্যাখ্যা দিয়ে আসতে পারি না। এছাড়াও, আপনাকে পল জনস্টন, গ্রেগ হোল্টকে ধন্যবাদ জানাই। (পার্শ্ব দ্রষ্টব্য: আপনি ছেলেরা কয়েকটি ভেরিওয়ার্ড কীওয়ার্ড বাদ দিয়েছিলেন তাই আমি সেগুলি যুক্ত করার স্বাধীনতা নিয়েছি))


পছন্দ করুন আমি আমার অ্যাপ্লিকেশনটিতে আপনার ফাংশনটি অনুলিপি / পেস্ট করতে চাই। দয়া করে আপনি কোনও লাইসেন্স দিতে পারেন
পিনোইয়িড

কোনও প্রয়োজন নেই, এটি একেবারে বিনামূল্যে ব্যবহারযোগ্য, এটি অন্য একটি বিনামূল্যে বাস্তবায়ন থেকে প্রাপ্ত একটি কাজ। তাই কেবল এটি ব্যবহার করুন এবং সম্ভবত আমার মতো লেখকদের মন্তব্য করুন।
ডিস্কেলনার

3

নোড.জেএস এর অন্তর্নির্মিত সমর্থন রয়েছে

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

উপরের কোড স্নিপেট স্ট্রিংয়ের জন্য এমডি 5 হেক্স স্ট্রিং গণনা করে hello world

এই সমাধানটির সুবিধাটি হ'ল আপনার অতিরিক্ত লাইব্রেরি ইনস্টল করার দরকার নেই।

আমি মনে করি সমাধানে তৈরিটি দ্রুত হওয়া উচিত। যদি তা না হয় তবে আমাদের নোড.জেএস প্রকল্পের জন্য ইস্যু / পিআর তৈরি করা উচিত।


1

js-md5 ইউটিএফ -8 স্ট্রিং, অ্যারে, অ্যারেবফার, এএমডি সমর্থন করে ...

এবং দ্রুত। 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/function/md5/ কেন চেষ্টা করবেন না ?

দুর্ভাগ্যক্রমে পারফরম্যান্স কোনও ইমুলেটেড স্ক্রিপ্টের সাথে সীমাবদ্ধ, তবে এটি বাস্তব এমডি 5 হ্যাশ সরবরাহ করতে পারে। যদিও আমি পাসওয়ার্ডগুলির জন্য এমডি 5 ব্যবহারের বিরুদ্ধে পরামর্শ দেব, কারণ এটি একটি দ্রুত-রেন্ডার হ্যাশ।


0

গ্রাফিক কার্ডে গণনা করে অনেক দ্রুত হ্যাশিং করা সম্ভব (ওয়েবজিএলে হ্যাশিং অ্যালগরিদম প্রয়োগ করুন), সেখানে SHA256 সম্পর্কে আলোচনা করা হয়েছে: ব্যবহারকারীর ভিডিও কার্ড ব্যবহার করে ব্রাউজারে sha256 হ্যাশগুলি গণনা করা কি সম্ভব? ওয়েবজিএল বা ফ্ল্যাশ ব্যবহার করে?


-3

আপনি আমার এমডি 5 বাস্তবায়নও পরীক্ষা করতে পারেন । এটি প্রায় হতে হবে। উপরে পোস্ট করা অন্যান্য হিসাবে একই। দুর্ভাগ্যক্রমে, পারফরম্যান্সটি অভ্যন্তরীণ লুপ দ্বারা সীমাবদ্ধ যা আরও অনুকূলিতকরণ অসম্ভব।


-4

আপনার অ্যাপ্লিকেশনটির কার্যকারিতা যদি এমড 5 এর জাভাস্ক্রিপ্ট প্রয়োগের মাধ্যমে সীমাবদ্ধ থাকে তবে আপনি সত্যিই কিছু ভুল করছেন। একটি স্থাপত্য পরিবর্তন বিবেচনা করুন (ইঙ্গিত: MD5 কম প্রায়ই ব্যবহার করুন)


3
আমি জেএসের সাথে "নেটিভ" অ্যাপ্লিকেশনটিতে এমডি 5 ব্যবহার করছি না, এটি একটি অনলাইন এমডি 5 চেক সরঞ্জাম: bruechner.de/md5file/js এমডি 5 এর জন্য আর নেটিভ অ্যাপ্লিকেশনের প্রয়োজন নেই;)
পাওয়ার ২ac
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.