Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

简易MD5函数(JavaScript实现)

  由于经常要用到MD5,老是用别人写的库既笨拙又不容易扩展,于是自己也封装了个简易的MD5函数。参考了以前VBS版的MD5函数实现,并把大堆的位运算简化,把一些常量通过公式计算出来,使代码更加精简。接口使用强类型数组,如果要用于字符串还需要先转码。
function md5(data){
  /**************************************************
  Author:次碳酸钴(admin@web-tinker.com)
  Input:Uint8Array
  Output:Uint8Array
  **************************************************/
  var i,j,k;
  var tis=[],abs=Math.abs,sin=Math.sin;
  for(i=1;i<=64;i++)tis.push(0x100000000*abs(sin(i))|0);
  var l=((data.length+8)>>>6<<4)+15,s=new Uint8Array(l<<2);
  s.set(new Uint8Array(data.buffer)),s=new Uint32Array(s.buffer);
  s[data.length>>2]|=0x80<<(data.length<<3&31);
  s[l-1]=data.length<<3;
  var params=[
    [function(a,b,c,d,x,s,t){
      return C(b&c|~b&d,a,b,x,s,t);
    },0,1,7,12,17,22],[function(a,b,c,d,x,s,t){
      return C(b&d|c&~d,a,b,x,s,t);
    },1,5,5,9,14,20],[function(a,b,c,d,x,s,t){
      return C(b^c^d,a,b,x,s,t);
    },5,3,4,11,16,23],[function(a,b,c,d,x,s,t){
      return C(c^(b|~d),a,b,x,s,t);
    },0,7,6,10,15,21]
  ],C=function(q,a,b,x,s,t){
    return a=a+q+(x|0)+t,(a<<s|a>>>(32-s))+b|0;
  },m=[1732584193,-271733879],o;
  m.push(~m[0],~m[1]);
  for(i=0;i<s.length;i+=16){
    o=m.slice(0);
    for(k=0,j=0;j<64;j++)m[k&3]=params[j>>4][0](
      m[k&3],m[++k&3],m[++k&3],m[++k&3],
      s[i+(params[j>>4][1]+params[j>>4][2]*j)%16],
      params[j>>4][3+j%4],tis[j]
    );
    for(j=0;j<4;j++)m[j]=m[j]+o[j]|0;
  };
  return new Uint8Array(new Uint32Array(m).buffer);
};
  使用演示:
<script src="http://www.web-tinker.com/share/md5.js"></script>
请选择需要计算MD5的文件:<input type="file" />
<script>
document.querySelector("input").onchange=function(){
  var fr=new FileReader;
  fr.onload=function(){
    var data=new Uint8Array(fr.result);
    var result=md5(data);
    var hex=Array.prototype.map.call(result,function(e){
      return (e<16?"0":"")+e.toString(16);
    }).join("");
    document.body.insertAdjacentHTML("beforeend","<p>"+hex+"</p>");
  };
  fr.readAsArrayBuffer(this.files[0]);
};
</script>
  如果需要计算字符串的MD5,先要将字符串转换为所需的编码,比如UTF-8
<script src="http://www.web-tinker.com/share/md5.js"></script>
<textarea>次碳酸钴</textarea><br/>
<input type="button" value="计算文本MD5(UTF-8)" />
<script>
function encodeUTF8(s){
  var i,r=[],c,x;
  for(i=0;i<s.length;i++)
    if((c=s.charCodeAt(i))<0x80)r.push(c);
    else if(c<0x800)r.push(0xC0+(c>>6&0x1F),0x80+(c&0x3F));
    else {
      if((x=c^0xD800)>>10==0) //对四字节UTF-16转换为Unicode
        c=(x<<10)+(s.charCodeAt(++i)^0xDC00)+0x10000,
        r.push(0xF0+(c>>18&0x7),0x80+(c>>12&0x3F));
      else r.push(0xE0+(c>>12&0xF));
      r.push(0x80+(c>>6&0x3F),0x80+(c&0x3F));
    };
  return r;
};

document.querySelector("input").onclick=function(){
  var textarea=document.querySelector("textarea");
  var data=new Uint8Array(encodeUTF8(textarea.value));
  var result=md5(data);
  var hex=Array.prototype.map.call(result,function(e){
    return (e<16?"0":"")+e.toString(16);
  }).join("");
  document.body.insertAdjacentHTML("beforeend","<p>"+hex+"</p>");
};
</script>
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^