diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b8fa43..44f9455 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# v0.2.0 / 2015-01-12 + +* Remove ascii parameter. +* Improve performance. + # v0.1.4 / 2015-01-11 * Improve performance. diff --git a/README.md b/README.md index 0bc1cce..07d5a80 100644 --- a/README.md +++ b/README.md @@ -30,20 +30,6 @@ If you use node.js, you should require the module first: md5 = require('js-md5'); ``` -### Methods - -#### md5(str, asciiOnly) - -Hash string to md5, set asciiOnly to true for better performace if you ensure input is ascii. - -##### *str: `String`* - -String to hash. - -##### *asciiOnly: `Boolean` (default: `false`)* - -Specify the string encoding is ASCII. - ## Example Code ```JavaScript diff --git a/bower.json b/bower.json index 783a4b1..3bfeb03 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "js-md5", - "version": "0.1.4", + "version": "0.2.0", "main": ["build/md5.min.js"], "ignore": [ "samples", diff --git a/build/md5.min.js b/build/md5.min.js index a6311ea..d6d8d61 100644 --- a/build/md5.min.js +++ b/build/md5.min.js @@ -1,10 +1,10 @@ -(function(m,x){var q="undefined"!=typeof module;q&&(m=global);var w="0123456789abcdef".split(""),e=[],r;if(!m.JS_MD5_TEST&&"undefined"!=typeof ArrayBuffer){var h=new ArrayBuffer(64);r=new Uint8Array(h);e=new Uint32Array(h)}var h=function(p,m){var n=1732584193,t=4023233417,h=2562383102,u=271733878,c,a,b,d,f,k=0,l,g,q=!1;if(!m&&/[^\x00-\x7F]/.test(p)){q=!0;l=[];for(a=g=0;ab?l[g++]=b:(2048>b?l[g++]=192|b>>6:(55296>b||57344<=b?l[g++]=224|b>>12:(b=65536+((b&1023)<<10| -p.charCodeAt(++a)&1023),l[g++]=240|b>>18,l[g++]=128|b>>12&63),l[g++]=128|b>>6&63),l[g++]=128|b&63);g=l.length}else g=p.length;do{e[0]=e[1]=e[2]=e[3]=e[4]=e[5]=e[6]=e[7]=e[8]=e[9]=e[10]=e[11]=e[12]=e[13]=e[14]=e[15]=0;if(q)if(r)for(a=0;ka;++k,++a)r[a]=l[k];else for(a=0;ka;++k,++a)e[a>>2]|=l[k]<<((a&3)<<3);else if(r)for(a=0;ka;++k,++a)r[a]=p.charCodeAt(k);else for(a=0;ka;++k,++a)e[a>>2]|=p.charCodeAt(k)<<((a&3)<<3);k==g&&(e[a>>2]|=128<<((a&3)<<3),e[14]=g<<3);c===x?(c=e[0]- -680876937,c=(c<<7|c>>>25)-271733879<<0,d=e[1]-117830708+(2004318071&c^-1732584194),d=(d<<12|d>>>20)+c<<0,b=e[2]-1126478375+((c^-271733879)&d^-271733879),b=(b<<17|b>>>15)+d<<0,a=e[3]-1316259209+((d^c)&b^c)):(c=n,a=t,b=h,d=u,c+=(d^a&(b^d))+e[0]-680876936,c=(c<<7|c>>>25)+a<<0,d+=(b^c&(a^b))+e[1]-389564586,d=(d<<12|d>>>20)+c<<0,b+=(a^d&(c^a))+e[2]+606105819,b=(b<<17|b>>>15)+d<<0,a+=(c^b&(d^c))+e[3]-1044525330);a=(a<<22|a>>>10)+b<<0;c+=(d^a&(b^d))+e[4]-176418897;c=(c<<7|c>>>25)+a<<0;d+=(b^c&(a^b))+e[5]+ -1200080426;d=(d<<12|d>>>20)+c<<0;b+=(a^d&(c^a))+e[6]-1473231341;b=(b<<17|b>>>15)+d<<0;a+=(c^b&(d^c))+e[7]-45705983;a=(a<<22|a>>>10)+b<<0;c+=(d^a&(b^d))+e[8]+1770035416;c=(c<<7|c>>>25)+a<<0;d+=(b^c&(a^b))+e[9]-1958414417;d=(d<<12|d>>>20)+c<<0;b+=(a^d&(c^a))+e[10]-42063;b=(b<<17|b>>>15)+d<<0;a+=(c^b&(d^c))+e[11]-1990404162;a=(a<<22|a>>>10)+b<<0;c+=(d^a&(b^d))+e[12]+1804603682;c=(c<<7|c>>>25)+a<<0;d+=(b^c&(a^b))+e[13]-40341101;d=(d<<12|d>>>20)+c<<0;b+=(a^d&(c^a))+e[14]-1502002290;b=(b<<17|b>>>15)+d<< -0;a+=(c^b&(d^c))+e[15]+1236535329;a=(a<<22|a>>>10)+b<<0;c+=(b^d&(a^b))+e[1]-165796510;c=(c<<5|c>>>27)+a<<0;d+=(a^b&(c^a))+e[6]-1069501632;d=(d<<9|d>>>23)+c<<0;b+=(c^a&(d^c))+e[11]+643717713;b=(b<<14|b>>>18)+d<<0;a+=(d^c&(b^d))+e[0]-373897302;a=(a<<20|a>>>12)+b<<0;c+=(b^d&(a^b))+e[5]-701558691;c=(c<<5|c>>>27)+a<<0;d+=(a^b&(c^a))+e[10]+38016083;d=(d<<9|d>>>23)+c<<0;b+=(c^a&(d^c))+e[15]-660478335;b=(b<<14|b>>>18)+d<<0;a+=(d^c&(b^d))+e[4]-405537848;a=(a<<20|a>>>12)+b<<0;c+=(b^d&(a^b))+e[9]+568446438; -c=(c<<5|c>>>27)+a<<0;d+=(a^b&(c^a))+e[14]-1019803690;d=(d<<9|d>>>23)+c<<0;b+=(c^a&(d^c))+e[3]-187363961;b=(b<<14|b>>>18)+d<<0;a+=(d^c&(b^d))+e[8]+1163531501;a=(a<<20|a>>>12)+b<<0;c+=(b^d&(a^b))+e[13]-1444681467;c=(c<<5|c>>>27)+a<<0;d+=(a^b&(c^a))+e[2]-51403784;d=(d<<9|d>>>23)+c<<0;b+=(c^a&(d^c))+e[7]+1735328473;b=(b<<14|b>>>18)+d<<0;a+=(d^c&(b^d))+e[12]-1926607734;a=(a<<20|a>>>12)+b<<0;f=a^b;c+=(f^d)+e[5]-378558;c=(c<<4|c>>>28)+a<<0;f=a^b;d+=(f^c)+e[8]-2022574463;d=(d<<11|d>>>21)+c<<0;f=d^c;b+=(f^ -a)+e[11]+1839030562;b=(b<<16|b>>>16)+d<<0;f=d^c;a+=(f^b)+e[14]-35309556;a=(a<<23|a>>>9)+b<<0;f=a^b;c+=(f^d)+e[1]-1530992060;c=(c<<4|c>>>28)+a<<0;f=a^b;d+=(f^c)+e[4]+1272893353;d=(d<<11|d>>>21)+c<<0;f=d^c;b+=(f^a)+e[7]-155497632;b=(b<<16|b>>>16)+d<<0;f=d^c;a+=(f^b)+e[10]-1094730640;a=(a<<23|a>>>9)+b<<0;f=a^b;c+=(f^d)+e[13]+681279174;c=(c<<4|c>>>28)+a<<0;f=a^b;d+=(f^c)+e[0]-358537222;d=(d<<11|d>>>21)+c<<0;f=d^c;b+=(f^a)+e[3]-722521979;b=(b<<16|b>>>16)+d<<0;f=d^c;a+=(f^b)+e[6]+76029189;a=(a<<23|a>>> -9)+b<<0;f=a^b;c+=(f^d)+e[9]-640364487;c=(c<<4|c>>>28)+a<<0;f=a^b;d+=(f^c)+e[12]-421815835;d=(d<<11|d>>>21)+c<<0;f=d^c;b+=(f^a)+e[15]+530742520;b=(b<<16|b>>>16)+d<<0;f=d^c;a+=(f^b)+e[2]-995338651;a=(a<<23|a>>>9)+b<<0;c+=(b^(a|~d))+e[0]-198630844;c=(c<<6|c>>>26)+a<<0;d+=(a^(c|~b))+e[7]+1126891415;d=(d<<10|d>>>22)+c<<0;b+=(c^(d|~a))+e[14]-1416354905;b=(b<<15|b>>>17)+d<<0;a+=(d^(b|~c))+e[5]-57434055;a=(a<<21|a>>>11)+b<<0;c+=(b^(a|~d))+e[12]+1700485571;c=(c<<6|c>>>26)+a<<0;d+=(a^(c|~b))+e[3]-1894986606; -d=(d<<10|d>>>22)+c<<0;b+=(c^(d|~a))+e[10]-1051523;b=(b<<15|b>>>17)+d<<0;a+=(d^(b|~c))+e[1]-2054922799;a=(a<<21|a>>>11)+b<<0;c+=(b^(a|~d))+e[8]+1873313359;c=(c<<6|c>>>26)+a<<0;d+=(a^(c|~b))+e[15]-30611744;d=(d<<10|d>>>22)+c<<0;b+=(c^(d|~a))+e[6]-1560198380;b=(b<<15|b>>>17)+d<<0;a+=(d^(b|~c))+e[13]+1309151649;a=(a<<21|a>>>11)+b<<0;c+=(b^(a|~d))+e[4]-145523070;c=(c<<6|c>>>26)+a<<0;d+=(a^(c|~b))+e[11]-1120210379;d=(d<<10|d>>>22)+c<<0;b+=(c^(d|~a))+e[2]+718787259;b=(b<<15|b>>>17)+d<<0;a+=(d^(b|~c))+e[9]- -343485551;a=(a<<21|a>>>11)+b<<0;n=n+c<<0;t=t+a<<0;h=h+b<<0;u=u+d<<0}while(kn;n++)var m=n<<3,h=h+(w[e>>m+4&15]+w[e>>m&15]);return h};!m.JS_MD5_TEST&&q?module.exports=h:m&&(m.md5=h)})(this); +(function(g,w){var x="undefined"!=typeof module;x&&(g=global);var y=!g.JS_MD5_TEST&&"undefined"!=typeof ArrayBuffer,z="0123456789abcdef".split(""),e=[],k;if(y){var h=new ArrayBuffer(68);k=new Uint8Array(h);e=new Uint32Array(h)}var A=[128,32768,8388608,-2147483648],m=[0,8,16,24],h=function(p){var n,q,r,g,b,a,d,c,f,l=0,h=0,v=0,t=p.length;e[16]=0;do{e[0]=e[16];e[16]=e[1]=e[2]=e[3]=e[4]=e[5]=e[6]=e[7]=e[8]=e[9]=e[10]=e[11]=e[12]=e[13]=e[14]=e[15]=0;if(y)for(a=h;la;++l)b=p.charCodeAt(l),128>b?k[a++]= +b:(2048>b?k[a++]=192|b>>6:(55296>b||57344<=b?k[a++]=224|b>>12:(b=65536+((b&1023)<<10|p.charCodeAt(++l)&1023),k[a++]=240|b>>18,k[a++]=128|b>>12&63),k[a++]=128|b>>6&63),k[a++]=128|b&63);else for(a=h;la;++l)b=p.charCodeAt(l),128>b?e[a>>2]|=b<b?e[a>>2]|=(192|b>>6)<b||57344<=b?e[a>>2]|=(224|b>>12)<>2]|=(240|b>>18)<>2]|=(128|b>>12&63)<>2]|=(128|b>>6&63)<>2]|=(128| +b&63)<>2]|=A[a&3],e[14]=v<<3);n===w?(b=e[0]-680876937,b=(b<<7|b>>>25)-271733879<<0,c=e[1]-117830708+(2004318071&b^-1732584194),c=(c<<12|c>>>20)+b<<0,d=e[2]-1126478375+((b^-271733879)&c^-271733879),d=(d<<17|d>>>15)+c<<0,a=e[3]-1316259209+((c^b)&d^b)):(b=n,a=q,d=r,c=g,b+=(c^a&(d^c))+e[0]-680876936,b=(b<<7|b>>>25)+a<<0,c+=(d^b&(a^d))+e[1]-389564586,c=(c<<12|c>>>20)+b<<0,d+=(a^c&(b^a))+e[2]+606105819,d=(d<<17|d>>>15)+c<<0,a+=(b^d&(c^b))+e[3]-1044525330);a=(a<<22|a>>> +10)+d<<0;b+=(c^a&(d^c))+e[4]-176418897;b=(b<<7|b>>>25)+a<<0;c+=(d^b&(a^d))+e[5]+1200080426;c=(c<<12|c>>>20)+b<<0;d+=(a^c&(b^a))+e[6]-1473231341;d=(d<<17|d>>>15)+c<<0;a+=(b^d&(c^b))+e[7]-45705983;a=(a<<22|a>>>10)+d<<0;b+=(c^a&(d^c))+e[8]+1770035416;b=(b<<7|b>>>25)+a<<0;c+=(d^b&(a^d))+e[9]-1958414417;c=(c<<12|c>>>20)+b<<0;d+=(a^c&(b^a))+e[10]-42063;d=(d<<17|d>>>15)+c<<0;a+=(b^d&(c^b))+e[11]-1990404162;a=(a<<22|a>>>10)+d<<0;b+=(c^a&(d^c))+e[12]+1804603682;b=(b<<7|b>>>25)+a<<0;c+=(d^b&(a^d))+e[13]-40341101; +c=(c<<12|c>>>20)+b<<0;d+=(a^c&(b^a))+e[14]-1502002290;d=(d<<17|d>>>15)+c<<0;a+=(b^d&(c^b))+e[15]+1236535329;a=(a<<22|a>>>10)+d<<0;b+=(d^c&(a^d))+e[1]-165796510;b=(b<<5|b>>>27)+a<<0;c+=(a^d&(b^a))+e[6]-1069501632;c=(c<<9|c>>>23)+b<<0;d+=(b^a&(c^b))+e[11]+643717713;d=(d<<14|d>>>18)+c<<0;a+=(c^b&(d^c))+e[0]-373897302;a=(a<<20|a>>>12)+d<<0;b+=(d^c&(a^d))+e[5]-701558691;b=(b<<5|b>>>27)+a<<0;c+=(a^d&(b^a))+e[10]+38016083;c=(c<<9|c>>>23)+b<<0;d+=(b^a&(c^b))+e[15]-660478335;d=(d<<14|d>>>18)+c<<0;a+=(c^b& +(d^c))+e[4]-405537848;a=(a<<20|a>>>12)+d<<0;b+=(d^c&(a^d))+e[9]+568446438;b=(b<<5|b>>>27)+a<<0;c+=(a^d&(b^a))+e[14]-1019803690;c=(c<<9|c>>>23)+b<<0;d+=(b^a&(c^b))+e[3]-187363961;d=(d<<14|d>>>18)+c<<0;a+=(c^b&(d^c))+e[8]+1163531501;a=(a<<20|a>>>12)+d<<0;b+=(d^c&(a^d))+e[13]-1444681467;b=(b<<5|b>>>27)+a<<0;c+=(a^d&(b^a))+e[2]-51403784;c=(c<<9|c>>>23)+b<<0;d+=(b^a&(c^b))+e[7]+1735328473;d=(d<<14|d>>>18)+c<<0;a+=(c^b&(d^c))+e[12]-1926607734;a=(a<<20|a>>>12)+d<<0;f=a^d;b+=(f^c)+e[5]-378558;b=(b<<4|b>>> +28)+a<<0;f=a^d;c+=(f^b)+e[8]-2022574463;c=(c<<11|c>>>21)+b<<0;f=c^b;d+=(f^a)+e[11]+1839030562;d=(d<<16|d>>>16)+c<<0;f=c^b;a+=(f^d)+e[14]-35309556;a=(a<<23|a>>>9)+d<<0;f=a^d;b+=(f^c)+e[1]-1530992060;b=(b<<4|b>>>28)+a<<0;f=a^d;c+=(f^b)+e[4]+1272893353;c=(c<<11|c>>>21)+b<<0;f=c^b;d+=(f^a)+e[7]-155497632;d=(d<<16|d>>>16)+c<<0;f=c^b;a+=(f^d)+e[10]-1094730640;a=(a<<23|a>>>9)+d<<0;f=a^d;b+=(f^c)+e[13]+681279174;b=(b<<4|b>>>28)+a<<0;f=a^d;c+=(f^b)+e[0]-358537222;c=(c<<11|c>>>21)+b<<0;f=c^b;d+=(f^a)+e[3]- +722521979;d=(d<<16|d>>>16)+c<<0;f=c^b;a+=(f^d)+e[6]+76029189;a=(a<<23|a>>>9)+d<<0;f=a^d;b+=(f^c)+e[9]-640364487;b=(b<<4|b>>>28)+a<<0;f=a^d;c+=(f^b)+e[12]-421815835;c=(c<<11|c>>>21)+b<<0;f=c^b;d+=(f^a)+e[15]+530742520;d=(d<<16|d>>>16)+c<<0;f=c^b;a+=(f^d)+e[2]-995338651;a=(a<<23|a>>>9)+d<<0;b+=(d^(a|~c))+e[0]-198630844;b=(b<<6|b>>>26)+a<<0;c+=(a^(b|~d))+e[7]+1126891415;c=(c<<10|c>>>22)+b<<0;d+=(b^(c|~a))+e[14]-1416354905;d=(d<<15|d>>>17)+c<<0;a+=(c^(d|~b))+e[5]-57434055;a=(a<<21|a>>>11)+d<<0;b+=(d^ +(a|~c))+e[12]+1700485571;b=(b<<6|b>>>26)+a<<0;c+=(a^(b|~d))+e[3]-1894986606;c=(c<<10|c>>>22)+b<<0;d+=(b^(c|~a))+e[10]-1051523;d=(d<<15|d>>>17)+c<<0;a+=(c^(d|~b))+e[1]-2054922799;a=(a<<21|a>>>11)+d<<0;b+=(d^(a|~c))+e[8]+1873313359;b=(b<<6|b>>>26)+a<<0;c+=(a^(b|~d))+e[15]-30611744;c=(c<<10|c>>>22)+b<<0;d+=(b^(c|~a))+e[6]-1560198380;d=(d<<15|d>>>17)+c<<0;a+=(c^(d|~b))+e[13]+1309151649;a=(a<<21|a>>>11)+d<<0;b+=(d^(a|~c))+e[4]-145523070;b=(b<<6|b>>>26)+a<<0;c+=(a^(b|~d))+e[11]-1120210379;c=(c<<10|c>>> +22)+b<<0;d+=(b^(c|~a))+e[2]+718787259;d=(d<<15|d>>>17)+c<<0;a+=(c^(d|~b))+e[9]-343485551;a=(a<<21|a>>>11)+d<<0;n===w?(n=b+1732584193<<0,q=a-271733879<<0,r=d-1732584194<<0,g=c+271733878<<0):(n=n+b<<0,q=q+a<<0,r=r+d<<0,g=g+c<<0)}while(lh;h++)var k=h<<3,g=g+(z[e>>k+4&15]+z[e>>k&15]);return g};!g.JS_MD5_TEST&&x?module.exports=h:g&&(g.md5=h)})(this); diff --git a/package.json b/package.json index 3732c5b..c89f478 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "js-md5", - "version": "0.1.4", + "version": "0.2.0", "description": "A simple MD5 hash function for JavaScript supports UTF-8 encoding.", "main": "src/md5.js", "devDependencies": { diff --git a/src/md5.js b/src/md5.js index 7bcfa42..3487511 100644 --- a/src/md5.js +++ b/src/md5.js @@ -1,5 +1,5 @@ /* - * js-md5 v0.1.4 + * js-md5 v0.2.0 * https://github.com/emn178/js-md5 * * Copyright 2014-2015, emn178@gmail.com @@ -10,62 +10,83 @@ ;(function(root, undefined) { 'use strict'; - var nodejs = typeof(module) != 'undefined'; - if(nodejs) { + var NODE_JS = typeof(module) != 'undefined'; + if(NODE_JS) { root = global; } + var ARRAY_BUFFER = !root.JS_MD5_TEST && typeof(ArrayBuffer) != 'undefined'; var HEX_CHARS = '0123456789abcdef'.split(''); var blocks = [], buffer8; - if(!root.JS_MD5_TEST && typeof(ArrayBuffer) != 'undefined') { - var buffer = new ArrayBuffer(64); + if(ARRAY_BUFFER) { + var buffer = new ArrayBuffer(68); buffer8 = new Uint8Array(buffer); blocks = new Uint32Array(buffer); } - var md5 = function(message, asciiOnly) { - var h0 = 0x67452301, h1 = 0xEFCDAB89, h2 = 0x98BADCFE, h3 = 0x10325476, - a, b, c, d, bc, da, index = 0, bytes, length, utf8 = false, i; - if(!asciiOnly && /[^\x00-\x7F]/.test(message)) { - utf8 = true; - bytes = getBytesFromUtf8(message); - length = bytes.length; - } else { - length = message.length; - } + var EXTRA = [128, 32768, 8388608, -2147483648]; + var SHIFT = [0, 8, 16, 24]; + + var md5 = function(message) { + var h0, h1, h2, h3, a, b, c, d, bc, da, code, + index = 0, i, start = 0, bytes = 0, length = message.length; + blocks[16] = 0; do { - blocks[0] = blocks[1] = blocks[2] = blocks[3] = + blocks[0] = blocks[16]; + blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[4] = blocks[5] = blocks[6] = blocks[7] = blocks[8] = blocks[9] = blocks[10] = blocks[11] = blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; - if(utf8) { - if(buffer8) { - for(i = 0;index < length && i < 64;++index, ++i) { - buffer8[i] = bytes[index]; - } - } else { - for(i = 0;index < length && i < 64;++index, ++i) { - blocks[i >> 2] |= bytes[index] <<((i & 3) << 3); + if(ARRAY_BUFFER) { + for (i = start;index < length && i < 64; ++index) { + code = message.charCodeAt(index); + if (code < 0x80) { + buffer8[i++] = code; + } else if (code < 0x800) { + buffer8[i++] = 0xc0 | (code >> 6); + buffer8[i++] = 0x80 | (code & 0x3f); + } else if (code < 0xd800 || code >= 0xe000) { + buffer8[i++] = 0xe0 | (code >> 12); + buffer8[i++] = 0x80 | ((code >> 6) & 0x3f); + buffer8[i++] = 0x80 | (code & 0x3f); + } else { + code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); + buffer8[i++] = 0xf0 | (code >> 18); + buffer8[i++] = 0x80 | ((code >> 12) & 0x3f); + buffer8[i++] = 0x80 | ((code >> 6) & 0x3f); + buffer8[i++] = 0x80 | (code & 0x3f); } } } else { - if(buffer8) { - for(i = 0;index < length && i < 64;++index, ++i) { - buffer8[i] = message.charCodeAt(index); - } - } else { - for(i = 0;index < length && i < 64;++index, ++i) { - blocks[i >> 2] |= message.charCodeAt(index) << ((i & 3) << 3); + for (i = start;index < length && i < 64; ++index) { + code = message.charCodeAt(index); + if (code < 0x80) { + blocks[i >> 2] |= code << SHIFT[i++ & 3]; + } else if (code < 0x800) { + blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } else if (code < 0xd800 || code >= 0xe000) { + blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } else { + code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); + blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; } } } + bytes += i - start; + start = i - 64; if(index == length) { - blocks[i >> 2] |= 0x80 << ((i & 3) << 3); - blocks[14] = length << 3; + blocks[i >> 2] |= EXTRA[i & 3]; + blocks[14] = bytes << 3; } - if(a === undefined) { + if(h0 === undefined) { a = blocks[0] - 680876937; a = (a << 7 | a >>> 25) - 271733879 << 0; d = blocks[1] - 117830708 + ((2004318071 & a) ^ -1732584194); @@ -226,10 +247,17 @@ b += (d ^ (c | ~a)) + blocks[9] - 343485551; b = (b << 21 | b >>> 11) + c << 0; - h0 = h0 + a << 0; - h1 = h1 + b << 0; - h2 = h2 + c << 0; - h3 = h3 + d << 0; + if(h0 === undefined) { + h0 = a + 1732584193 << 0; + h1 = b - 271733879<< 0; + h2 = c - 1732584194 << 0; + h3 = d + 271733878 << 0; + } else { + h0 = h0 + a << 0; + h1 = h1 + b << 0; + h2 = h2 + c << 0; + h3 = h3 + d << 0; + } } while(index < length); return toHexString(h0) + toHexString(h1) + toHexString(h2) + toHexString(h3); @@ -244,31 +272,7 @@ return hex; }; - var getBytesFromUtf8 = function(str) { - var bytes = [], index = 0; - for (var i = 0;i < str.length; i++) { - var c = str.charCodeAt(i); - if (c < 0x80) { - bytes[index++] = c; - } else if (c < 0x800) { - bytes[index++] = 0xc0 | (c >> 6); - bytes[index++] = 0x80 | (c & 0x3f); - } else if (c < 0xd800 || c >= 0xe000) { - bytes[index++] = 0xe0 | (c >> 12); - bytes[index++] = 0x80 | ((c >> 6) & 0x3f); - bytes[index++] = 0x80 | (c & 0x3f); - } else { - c = 0x10000 + (((c & 0x3ff) << 10) | (str.charCodeAt(++i) & 0x3ff)); - bytes[index++] = 0xf0 | (c >> 18); - bytes[index++] = 0x80 | ((c >> 12) & 0x3f); - bytes[index++] = 0x80 | ((c >> 6) & 0x3f); - bytes[index++] = 0x80 | (c & 0x3f); - } - } - return bytes; - }; - - if(!root.JS_MD5_TEST && nodejs) { + if(!root.JS_MD5_TEST && NODE_JS) { module.exports = md5; } else if(root) { root.md5 = md5;