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,超强推荐share.js
Dec 23 Javascript
ImageFlow可鼠标控制图片滚动
Jan 30 Javascript
JavaScript CSS 修改学习第四章 透明度设置
Feb 19 Javascript
javascript模块化是什么及其优缺点介绍
Sep 02 Javascript
js实现通用的微信分享组件示例
Mar 10 Javascript
60行js代码实现俄罗斯方块
Mar 31 Javascript
AngularJS基础知识笔记之表格
May 10 Javascript
浅谈JavaScript的闭包函数
Dec 08 Javascript
ajax的分页查询示例(不刷新页面)
Jan 11 Javascript
JS获取子、父、兄节点方法小结
Aug 14 Javascript
jQuery 利用ztree实现树形表格的实例代码
Sep 27 jQuery
Vue打包后出现一些map文件的解决方法
Feb 13 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
1 Tube Radio
2021/03/02 无线电
聊天室php&amp;mysql(二)
2006/10/09 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
iOS10推送通知开发教程
2016/09/19 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
在laravel框架中实现封装公共方法全局调用
2019/10/14 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
JavaScript Array扩展实现代码
2009/10/14 Javascript
关于图片按比例自适应缩放的js代码
2011/10/30 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
js的alert弹出框出现乱码解决方案
2013/09/02 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
Bootstrap入门书籍之(三)栅格系统
2016/02/17 Javascript
JavaScript函数内部属性和函数方法实例详解
2016/03/17 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
create-react-app修改为多页面支持的方法
2018/05/17 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
python三元运算符实现方法
2013/12/17 Python
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
Python实现翻转数组功能示例
2018/01/12 Python
Python测试人员需要掌握的知识
2018/02/08 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
Python实现快速排序的方法详解
2019/10/25 Python
python pygame实现滚动横版射击游戏城市之战
2019/11/25 Python
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
台湾家适得:Homeget
2019/02/11 全球购物
学校十一活动方案
2014/02/01 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
Python基础之Socket通信原理
2021/04/22 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL
在容器中使用nginx搭建上传下载服务器
2022/05/11 Servers