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 相关文章推荐
游戏人文件夹程序 ver 4.03
Jul 14 Javascript
TreeView 用法(有代码)(asp.net)
Jul 15 Javascript
js获取网页高度(详细整理)
Dec 28 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
Jun 08 Javascript
JS小功能(offsetLeft实现图片滚动效果)实例代码
Nov 28 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
Feb 20 Javascript
用svg制作富有动态的tooltip
Jul 17 Javascript
微信小程序 wx:for的使用实例详解
Apr 27 Javascript
AngularJS的ng-click传参的方法
Jun 19 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
Oct 09 Javascript
js实现移动端轮播图
Dec 21 Javascript
深入浅析vue中cross-env的使用
Sep 12 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算开始时间到过期时间的相隔的天数
2011/01/12 PHP
使用JSON实现数据的跨域传输的php代码
2011/12/20 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
2014/02/12 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
python实现得到一个给定类的虚函数
2014/09/28 Python
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
PyTorch里面的torch.nn.Parameter()详解
2020/01/03 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
2020/02/04 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
python中zip()函数遍历多个列表方法
2021/02/18 Python
应届生煤化工求职信
2013/10/21 职场文书
商场消防管理制度
2014/01/12 职场文书
幼儿园教研活动总结
2014/04/30 职场文书
化学教育专业自荐信
2014/07/04 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
论文答谢词
2015/01/20 职场文书
建议书范文
2015/02/05 职场文书
《观察物体》教学反思
2016/02/17 职场文书
导游词之唐山景点
2019/12/18 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers