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 相关文章推荐
JQuery中$之选择器用法介绍
Apr 05 Javascript
33个优秀的 jQuery 图片展示插件分享
Mar 14 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
Mar 05 Javascript
jquery教程ajax请求json数据示例
Jan 13 Javascript
用JavaScript实现对话框的教程
Jun 04 Javascript
jQuery插件jquery-barcode实现条码打印的方法
Nov 25 Javascript
jQuery AjaxUpload 上传图片代码
Feb 02 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
Dec 08 Javascript
jquery实时获取时间的简单实例
Jan 26 Javascript
Bootstrap响应式表格详解
May 23 Javascript
JS实现深度优先搜索求解两点间最短路径
Jan 17 Javascript
JavaScript parseInt0.0000005打印5原理解析
Jul 23 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
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
php之可变变量的实例详解
2017/09/12 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
2018/10/12 PHP
javascript radio 联动效果
2009/03/04 Javascript
JS解析XML的实现代码
2009/11/12 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
jQuery 插件仿百度搜索框智能提示(带Value值)
2013/01/22 Javascript
jquery cookie的用法总结
2013/11/18 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
2019/01/16 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
Python兔子毒药问题实例分析
2015/03/05 Python
Python使用遗传算法解决最大流问题
2018/01/29 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
Python 画出来六维图
2019/07/26 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
红领巾心向党广播稿
2014/01/19 职场文书
光荣入党自我鉴定
2014/01/22 职场文书
应聘文员自荐信范文
2014/03/11 职场文书
党风廉政建设责任书
2014/04/14 职场文书
工商管理本科生求职信
2014/07/13 职场文书
刑事申诉状范文
2015/05/20 职场文书
单位考核鉴定意见
2015/06/05 职场文书
八年级历史教学反思
2016/02/19 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
javascript Number 与 Math对象的介绍
2021/11/17 Javascript