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 相关文章推荐
在UpdatePanel内jquery easyui效果失效的解决方法
Apr 11 Javascript
js 文件引入实现代码
Apr 23 Javascript
解决jquery的.animate()函数在IE6下的问题
Dec 03 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
Aug 04 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
Nov 07 Javascript
非常棒的jQuery图片轮播效果
Apr 17 Javascript
利用angular.copy取消变量的双向绑定与解析
Nov 25 Javascript
JS实现select选中option触发事件操作示例
Jul 13 Javascript
vue实现商城秒杀倒计时功能
Dec 12 Javascript
jQuery实现点击滚动到指定元素上的方法分析
Mar 19 jQuery
vue-cli3中配置alias和打包加hash值操作
Sep 04 Javascript
vue ant design 封装弹窗表单的使用
Jun 01 Vue.js
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中array_merge和array相加的区别分析
2013/06/17 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
Laravel日志用法详解
2016/10/09 PHP
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
2016/11/23 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
[53:20]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 VG vs OG
2018/04/03 DOTA
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
Python实时获取cmd的输出
2015/12/13 Python
将字典转换为DataFrame并进行频次统计的方法
2018/04/08 Python
keras CNN卷积核可视化,热度图教程
2020/06/22 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
《陶罐和铁罐》教学反思
2014/02/19 职场文书
地球一小时宣传标语
2014/06/24 职场文书
小学生植树节活动总结
2014/07/04 职场文书
租车协议书范本2014
2014/11/17 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
春节随笔
2015/08/15 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
dubbo服务整合zipkin详解
2021/07/26 Java/Android
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python
php将xml转化对象的实例详解
2021/11/17 PHP