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 相关文章推荐
兼容Mozilla必须知道的知识。
Jan 09 Javascript
jQuery判断密码强度实现思路及代码
Apr 24 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
Feb 26 Javascript
JavaScript学习笔记之数组求和方法
Mar 23 Javascript
JavaScript原生对象常用方法总结(推荐)
May 13 Javascript
JS使用eval()动态创建变量的方法
Jun 03 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
Aug 10 Javascript
深入对Vue.js $watch方法的理解
Mar 20 Javascript
深入理解Vue Computed计算属性原理
May 29 Javascript
使用electron制作满屏心特效的示例代码
Nov 27 Javascript
小程序实现新用户判断并跳转激活的方法
May 20 Javascript
JS写滑稽笑脸运动效果
May 28 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】人族1v7家ZBath
2020/03/04 星际争霸
php类中private属性继承问题分析
2012/11/01 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
2013/06/28 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
2015/09/09 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
js 获取范围内的随机数实例代码
2016/08/02 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
python 字典操作提取key,value的方法
2019/06/26 Python
django框架ModelForm组件用法详解
2019/12/11 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
Python调用Redis的示例代码
2020/11/24 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
3分钟演讲稿
2014/04/30 职场文书
社团活动总结怎么写
2014/06/30 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
签字仪式主持词
2015/07/03 职场文书
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js