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 学习笔记 element属性控制
Jul 23 Javascript
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
Jul 17 Javascript
JavaScript 的继承
Oct 01 Javascript
js中更短的 Array 类型转换
Oct 30 Javascript
ie下jquery.getJSON的缓存问题的处理方法
Mar 29 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
Dec 01 Javascript
JSON键值对序列化和反序列化解析
Jan 24 Javascript
JavaScript实现的XML与JSON互转功能详解
Feb 16 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
Sep 21 Javascript
React组件对子组件children进行加强的方法
Jun 23 Javascript
前端监听websocket消息并实时弹出(实例代码)
Nov 27 Javascript
输入框跟随文字内容适配宽实现示例
Aug 14 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阿拉伯数字转中文人民币大写
2015/12/21 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
JavaScript静态的动态
2006/09/18 Javascript
JS数组的遍历方式for循环与for...in
2014/07/31 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
Pyhton中防止SQL注入的方法
2015/02/05 Python
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
python二分查找算法的递归实现方法
2016/05/12 Python
关于Python中浮点数精度处理的技巧总结
2017/08/10 Python
python实现点对点聊天程序
2018/07/28 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
2020/07/31 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
css3实现超炫风车特效
2014/11/12 HTML / CSS
苹果台湾官网:Apple台湾
2019/01/05 全球购物
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
大一军训感言
2014/01/09 职场文书
捐书活动总结
2014/05/04 职场文书
2014老师三严三实对照检查材料思想汇报
2014/09/18 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
安全员岗位职责
2015/02/10 职场文书
大学生自荐书范文
2015/03/05 职场文书
画展观后感
2015/06/17 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers
Mysql数据库命令大全
2021/05/26 MySQL