javascript中实现兼容JAVA的hashCode算法代码分享


Posted in Javascript onAugust 11, 2020

在java中一个hashCode算法,可以用来计算一个字符串的hash值,今天一个朋友突然问俺能不能在js中计算hashCode,要求和java的hashCode计算结果一样。

对于java的hashCode,以前到现在也一直没有了解过其算法,不过猜想应该也不会太难,于是现在java中写了这段代码进行测试:
运行结果:899755

按下Ctrl键点击hashCode方法名跟进去看了下其算法,发现是很简单的几句代码,如下所示:

public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;

for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}

这下好,简单移植过去到js里就应该ok了。于是写出如下JS代码:

<script type="text/javascript">
function hashCode(str){
     var h = 0, off = 0;
     var len = str.length;
     for(var i = 0; i < len; i++){
       h = 31 * h + str.charCodeAt(off++);
     }
     return h;
   }
   alert(hashCode('沈阳'));
  </script>

运行结果:899755

OK,与java计算结果一样。本以为这么就搞定了,然后想着再随便找个串测试下:

“沈阳沈阳啊”,在JAVA中运行结果为:1062711668,然而到js中成了:26832515444。

狂晕,这随便一试就有问题了!后思考片刻,突然想到Java中int长度好像是21亿左右,js中就没这限制了。问题应该就是在这里了,于是对之前的方法做了一点改造:

<script>
function hashCode(str){
     var h = 0, off = 0;
     var len = str.length;
     for(var i = 0; i < len; i++){
       h = 31 * h + str.charCodeAt(off++);
     }
   var t=-2147483648*2;
   while(h>2147483647){
    h+=t
   }
     return h;
   }
alert(hashCode('沈阳沈阳啊'));

</script>

再次测试!OK!大功告成。没有什么技术含量,一点小总结
2013-02-19更新,上面那个效率比较低下,当内容很长的时候会当掉,下面的代码是优化后的代码:

<script>
  function hashCode(str) {
    var h = 0;
    var len = str.length;
    var t = 2147483648;
    for (var i = 0; i < len; i++) {
      h = 31 * h + str.charCodeAt(i);
      if(h > 2147483647) h %= t;//java int溢出则取模
    }
    /*var t = -2147483648 * 2;
    while (h > 2147483647) {
      h += t
    }*/
    return h;
  }
  alert(hashCode('C#同一时间N个线程在并发执行,其余在队列中如何实现')); //1107373715
</script>

看过外人写的

Javascript implementation of Java's String.hashCode() method 21

这里是Java的直接替代品字符串.hashCode()用Javascript实现的方法。

我编写这个函数是为了满足工作中的一个需求。显然,后端工程师认为hashCode()是一个标准函数。这个项目的一个障碍不仅是如何翻译Java中用来生成hashCode()的数学公式,还包括如何强制Javascript使用32位整数数学(这不是一个小的壮举)。

幸运的是,我发现Java支持位运算符,这些运算符被限制在32位整数数学中。

下面是Javascript生成的字符串原型。使用这个原型,您可以简单地对任何字符串调用.hashCode(),例如“some string”.hashCode(),并接收一个数字哈希代码(更具体地说,是一个Java等效代码),如1395333309。

String.prototype.hashCode = function(){
	var hash = 0;
	if (this.length == 0) return hash;
	for (i = 0; i < this.length; i++) {
		char = this.charCodeAt(i);
		hash = ((hash<<5)-hash)+char;
		hash = hash & hash; // Convert to 32bit integer
	}
	return hash;
}

另外分享一个phpcom中用的函数

String.prototype.hashCode = function() {for (var a = 31,b = 0,c = this.length; b < c;) a ^= (a << 5) + (a >> 2) + this.charCodeAt(b++); return a};

以上就是javascript中实现兼容JAVA的hashCode算法代码分享的详细内容,更多关于javascript兼容JAVA的hashCode算法的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js下用gb2312编码解码实现方法
Dec 31 Javascript
javascript delete 使用示例代码
Mar 29 Javascript
从零学JSON之JSON数据结构
May 19 Javascript
JavaScript定时器和优化的取消定时器方法
Jul 03 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
Aug 05 Javascript
Bootstrap CSS使用方法
Dec 23 Javascript
原生JS实现跑马灯效果
Feb 20 Javascript
基于jquery实现多级菜单效果
Jul 25 jQuery
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
Oct 15 Javascript
js解决软键盘遮挡输入框的问题分享
Dec 19 Javascript
Vue的watch和computed方法的使用及区别介绍
Sep 06 Javascript
Angular处理未可知异常错误的方法详解
Jan 17 Javascript
javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)
Aug 15 #Javascript
javascript使用window.open提示“已经计划系统关机”的原因
Aug 15 #Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
Aug 15 #Javascript
javascript中的__defineGetter__和__defineSetter__介绍
Aug 15 #Javascript
js 判断图片是否加载完以及实现图片的预下载
Aug 14 #Javascript
js创建表单元素并使用submit进行提交
Aug 14 #Javascript
使用typeof判断function是否存在于上下文
Aug 14 #Javascript
You might like
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
微信API接口大全
2015/04/15 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
javascript与asp.net(c#)互相调用方法
2009/12/13 Javascript
javascript 多浏览器 事件大全
2010/03/23 Javascript
kmock javascript 单元测试代码
2011/02/06 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
2013/07/21 Javascript
JS操作数据库的实例代码
2013/10/17 Javascript
Javascript delete 引用类型对象
2013/11/01 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
python 切换root 执行命令的方法
2019/01/19 Python
django API 中接口的互相调用实例
2020/04/01 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
navabi英国:设计师大码女装
2019/06/25 全球购物
网页设计个人找工作求职信
2013/11/28 职场文书
揭牌仪式主持词
2014/03/19 职场文书
马智宇婚礼主持词
2014/03/22 职场文书
售后服务承诺书范文
2014/03/26 职场文书
中等生评语大全
2014/05/04 职场文书
2015年中个人总结范文
2015/03/10 职场文书
反邪教学习心得体会
2016/01/15 职场文书
Ajax异步刷新功能及简单案例
2021/11/20 Javascript