jquery插件开发之实现md5插件


Posted in Javascript onMarch 17, 2014

方法返回的是一串十进制数,在jquery1.9.2下测试通过。

(function($){
 $.md5 = function(o) {
  if(null === o) {
   return 'null';
  }
  if(typeof o != "string") {
   return 'null';
  }
  //计算填充的长度
  var fill_data_len = 0;
  var data_len = o.length;
  var d_l_mod = data_len % MD5_BASE_LEN;
  if(0 != d_l_mod)
   fill_data_len = MD5_BASE_LEN - d_l_mod;
  if(fill_data_len < 8)
   fill_data_len += MD5_BASE_LEN;
  var buf = new Array(data_len + fill_data_len);
  for(var i = 0;i < data_len;i++)
   buf[i] = o.charCodeAt(i);
  var msg_bit_len = data_len * BYTE_BIT_LEN
  buf[data_len] = FIRST_FILL_BYTE;
  for(var i = 0;i < 4;i++) {
   buf[data_len + fill_data_len - 8 + i] =
    ((msg_bit_len & (0x000000ff << (i * 8)))
        >> (i * 8));
  }
  var md5_c = [MD5_A,MD5_B,MD5_C,MD5_D];
  var md5_code = [MD5_A,MD5_B,MD5_C,MD5_D];
  for(var m = 0;m < data_len + fill_data_len;m += 64) {
   var buf_p = new Array(16);
   for(var i = 0;i < 16;i++) {
    buf_p[i] = 0;
    for(var j = 0;j < 4;j++) {
     buf_p[i] <<= 8;
     buf_p[i] |= buf[m + j + i * 4];
    }
   }
   for(var k = 0;k < 16;k += 4) {
    md5_c[0] = FF(md5_c[0],md5_c[1],md5_c[2],
      md5_c[3],buf_p[k],7,md5_ti[k]);
    md5_c[3] = FF(md5_c[3],md5_c[0],md5_c[1],
      md5_c[2],buf_p[k + 1],12,
      md5_ti[k + 1]);
    md5_c[2] = FF(md5_c[2],md5_c[3],md5_c[0],
      md5_c[1],buf_p[k + 2],17,
      md5_ti[k + 2]);
    md5_c[1] = FF(md5_c[1],md5_c[2],md5_c[3],
      md5_c[0],buf_p[k + 3],22,
      md5_ti[k + 3]);
   }
   md5_c[0] = GG(md5_c[0],md5_c[1],md5_c[2],md5_c[3],
      buf_p[1],5,md5_ti[16]);
   md5_c[3] = GG(md5_c[3],md5_c[0],md5_c[1],md5_c[2],
      buf_p[6],9,md5_ti[17]);
   md5_c[2] = GG(md5_c[2],md5_c[3],md5_c[0],md5_c[1],
      buf_p[11],14,md5_ti[18]);
   md5_c[1] = GG(md5_c[1],md5_c[2],md5_c[3],md5_c[0],
      buf_p[0],20,md5_ti[19]);
   md5_c[0] = GG(md5_c[0],md5_c[1],md5_c[2],md5_c[3],
      buf_p[5],5,md5_ti[20]);
   md5_c[3] = GG(md5_c[3],md5_c[0],md5_c[1],md5_c[2],
      buf_p[10],9,md5_ti[21]);
   md5_c[2] = GG(md5_c[2],md5_c[3],md5_c[0],md5_c[1],
      buf_p[15],14,md5_ti[22]);
   md5_c[1] = GG(md5_c[1],md5_c[2],md5_c[3],md5_c[0],
      buf_p[4],20,md5_ti[23]);
   md5_c[0] = GG(md5_c[0],md5_c[1],md5_c[2],md5_c[3],
      buf_p[9],5,md5_ti[24]);
   md5_c[3] = GG(md5_c[3],md5_c[0],md5_c[1],md5_c[2],
      buf_p[14],9,md5_ti[25]);
   md5_c[2] = GG(md5_c[2],md5_c[3],md5_c[0],md5_c[1],
      buf_p[3],14,md5_ti[26]);
   md5_c[1] = GG(md5_c[1],md5_c[2],md5_c[3],md5_c[0],
      buf_p[8],20,md5_ti[27]);
   md5_c[0] = GG(md5_c[0],md5_c[1],md5_c[2],md5_c[3],
      buf_p[13],5,md5_ti[28]);
   md5_c[3] = GG(md5_c[3],md5_c[0],md5_c[1],md5_c[2],
      buf_p[2],9,md5_ti[29]);
   md5_c[2] = GG(md5_c[2],md5_c[3],md5_c[0],md5_c[1],
      buf_p[7],14,md5_ti[30]);
   md5_c[1] = GG(md5_c[1],md5_c[2],md5_c[3],md5_c[0],
      buf_p[12],20,md5_ti[31]);
   md5_c[0] = HH(md5_c[0],md5_c[1],md5_c[2],md5_c[3],
      buf_p[5],4,md5_ti[32]);
   md5_c[3] = HH(md5_c[3],md5_c[0],md5_c[1],md5_c[2],
      buf_p[8],11,md5_ti[33]);
   md5_c[2] = HH(md5_c[2],md5_c[3],md5_c[0],md5_c[1],
      buf_p[11],16,md5_ti[34]);
   md5_c[1] = HH(md5_c[1],md5_c[2],md5_c[3],md5_c[0],
      buf_p[14],23,md5_ti[35]);
   md5_c[0] = HH(md5_c[0],md5_c[1],md5_c[2],md5_c[3],
      buf_p[1],4,md5_ti[36]);
   md5_c[3] = HH(md5_c[3],md5_c[0],md5_c[1],md5_c[2],
      buf_p[4],11,md5_ti[37]);
   md5_c[2] = HH(md5_c[2],md5_c[3],md5_c[0],md5_c[1],
      buf_p[7],16,md5_ti[38]);
   md5_c[1] = HH(md5_c[1],md5_c[2],md5_c[3],md5_c[0],
      buf_p[10],23,md5_ti[39]);
   md5_c[0] = HH(md5_c[0],md5_c[1],md5_c[2],md5_c[3],
      buf_p[13],4,md5_ti[40]);
   md5_c[3] = HH(md5_c[3],md5_c[0],md5_c[1],md5_c[2],
      buf_p[0],11,md5_ti[41]);
   md5_c[2] = HH(md5_c[2],md5_c[3],md5_c[0],md5_c[1],
      buf_p[3],16,md5_ti[42]);
   md5_c[1] = HH(md5_c[1],md5_c[2],md5_c[3],md5_c[0],
      buf_p[6],23,md5_ti[43]);
   md5_c[0] = HH(md5_c[0],md5_c[1],md5_c[2],md5_c[3],
      buf_p[9],4,md5_ti[44]);
   md5_c[3] = HH(md5_c[3],md5_c[0],md5_c[1],md5_c[2],
      buf_p[12],11,md5_ti[45]);
   md5_c[2] = HH(md5_c[2],md5_c[3],md5_c[0],md5_c[1],
      buf_p[15],16,md5_ti[46]);
   md5_c[1] = HH(md5_c[1],md5_c[2],md5_c[3],md5_c[0],
      buf_p[2],23,md5_ti[47]);
   md5_c[0] = II(md5_c[0],md5_c[1],md5_c[2],md5_c[3],
      buf_p[0],6,md5_ti[48]);
   md5_c[3] = II(md5_c[3],md5_c[0],md5_c[1],md5_c[2],
      buf_p[7],10,md5_ti[49]);
   md5_c[2] = II(md5_c[2],md5_c[3],md5_c[0],md5_c[1],
      buf_p[14],15,md5_ti[50]);
   md5_c[1] = II(md5_c[1],md5_c[2],md5_c[3],md5_c[0],
      buf_p[5],21,md5_ti[51]);
   md5_c[0] = II(md5_c[0],md5_c[1],md5_c[2],md5_c[3],
      buf_p[12],6,md5_ti[52]);
   md5_c[3] = II(md5_c[3],md5_c[0],md5_c[1],md5_c[2],
      buf_p[3],10,md5_ti[53]);
   md5_c[2] = II(md5_c[2],md5_c[3],md5_c[0],md5_c[1],
      buf_p[10],15,md5_ti[54]);
   md5_c[1] = II(md5_c[1],md5_c[2],md5_c[3],md5_c[0],
      buf_p[1],21,md5_ti[55]);
   md5_c[0] = II(md5_c[0],md5_c[1],md5_c[2],md5_c[3],
      buf_p[8],6,md5_ti[56]);
   md5_c[3] = II(md5_c[3],md5_c[0],md5_c[1],md5_c[2],
      buf_p[15],10,md5_ti[57]);
   md5_c[2] = II(md5_c[2],md5_c[3],md5_c[0],md5_c[1],
      buf_p[6],15,md5_ti[58]);
   md5_c[1] = II(md5_c[1],md5_c[2],md5_c[3],md5_c[0],
      buf_p[13],21,md5_ti[59]);
   md5_c[0] = II(md5_c[0],md5_c[1],md5_c[2],md5_c[3],
      buf_p[4],6,md5_ti[60]);
   md5_c[3] = II(md5_c[3],md5_c[0],md5_c[1],md5_c[2],
      buf_p[11],10,md5_ti[61]);
   md5_c[2] = II(md5_c[2],md5_c[3],md5_c[0],md5_c[1],
      buf_p[2],15,md5_ti[62]);
   md5_c[1] = II(md5_c[1],md5_c[2],md5_c[3],md5_c[0],
      buf_p[9],21,md5_ti[63]);
   for(var i = 0;i < 4;i++) {
    md5_code[i] += md5_c[i];
   }
   for(var i = 0;i < 4;i++) {
    md5_c[i] = md5_code[i];
   }
  }
  var md5_code_str =  "" + md5_code[0];
  for(var i = 1;i < 4;i++)
   md5_code_str += md5_code[i];
  return md5_code_str;
 };
}(jQuery));
function F(x,y,z)
{
 return (((x) & (y)) | ((~(x)) & (z)));
}
function G(x,y,z)
{
 return (((x) & (z)) | ((y) & (~(z))));
}
function H(x,y,z)
{
 return ((x) ^ (y) ^ (z));
}
function I(x,y,z)
{
 return ((y) ^ ((x) | (~(z))));
}
function bit_rol(d,n)
{
 return (((d) <<  (n)) | ((d) >> (32 - (n))));
}
function FF(a,b,c,d,m,s,t)
{
 return b + bit_rol((a + F(b,c,d) + m + t),s);
}
function GG(a,b,c,d,m,s,t)
{
 return b + bit_rol((a + G(b,c,d) + m + t),s);
}
function HH(a,b,c,d,m,s,t)
{
 return b + bit_rol((a + H(b,c,d) + m + t),s);
}
function II(a,b,c,d,m,s,t)
{
 return b + bit_rol((a + I(b,c,d) + m + t),s);
}
var md5_ti = [
 0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,
 0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,
 0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,
 0x6b901122,0xfd987193,0xa679438e,0x49b40821,
 0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,
 0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
 0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,
 0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,
 0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,
 0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,
 0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,
 0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,
 0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,
 0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,
 0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,
 0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391
];
var BYTE_BIT_LEN = 8;
var MD5_BASE_LEN = 64;
var MD5_A = 0x67452301;
var MD5_B = 0xefcdab89;
var MD5_C = 0x98badcfe;
var MD5_D = 0x10325476;
var FIRST_FILL_BYTE = 0x80;
Javascript 相关文章推荐
JS实现打开本地文件或文件夹
Mar 09 Javascript
JS中eval函数的使用示例
Jul 21 Javascript
JS特效实现图片自动播放并可控的效果
Jul 31 Javascript
JS+CSS实现滑动切换tab菜单效果
Aug 25 Javascript
浅析node连接数据库(express+mysql)
Nov 30 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
Sep 28 Javascript
vue-router:嵌套路由的使用方法
Feb 21 Javascript
js/jq仿window文件夹框选操作插件
Mar 08 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
Jul 10 Javascript
Vue为什么要谨慎使用$attrs与$listeners
Aug 27 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
Nov 10 Javascript
JS的深浅复制详细
Oct 16 Javascript
js对图片base64编码字符串进行解码并输出图像示例
Mar 17 #Javascript
javascript文件中引用依赖的js文件的方法
Mar 17 #Javascript
jquery解析JSON数据示例代码
Mar 17 #Javascript
javascript事件函数中获得事件源的两种不错方法
Mar 17 #Javascript
javascript内置对象arguments详解
Mar 16 #Javascript
javascript跨浏览器的属性判断方法
Mar 16 #Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
Mar 16 #Javascript
You might like
使用NetBeans + Xdebug调试PHP程序的方法
2011/04/12 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
PHP检测用户语言的方法
2015/06/15 PHP
php类的定义与继承用法实例
2015/07/07 PHP
PHP+Javascript实现在线拍照功能实例
2015/07/18 PHP
php设计模式之委托模式
2016/02/13 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
jquery 防止表单重复提交代码
2010/01/21 Javascript
js页面跳转常用的几种方式
2010/11/25 Javascript
JsRender实用入门教程
2014/10/31 Javascript
总结十个Angular.js由浅入深的面试问题
2016/08/26 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
selenium+python设置爬虫代理IP的方法
2018/11/29 Python
Python3离线安装Requests模块问题
2019/10/13 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
Python发送邮件封装实现过程详解
2020/05/09 Python
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
公司辞职信模板
2015/05/13 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android
spring boot中nativeQuery的用法
2021/07/26 Java/Android
canvas 中如何实现物体的框选
2022/08/05 Javascript