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 使用form表单select类实现级联菜单效果
Dec 19 Javascript
用Javascript获取页面元素的具体位置
Dec 09 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
Mar 08 Javascript
判断iframe里的页面是否加载完成
Jun 06 Javascript
Javascript基础教程之switch语句
Jan 18 Javascript
jQuery实现图片文字淡入淡出效果
Dec 21 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
Dec 30 Javascript
浅谈$_FILES数组为空的原因
Feb 16 Javascript
JS仿Base.js实现的继承示例
Apr 07 Javascript
解决vue的 v-for 循环中图片加载路径问题
Sep 03 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
Sep 09 Javascript
JavaScript日期库date-fn.js使用方法解析
Sep 09 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
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
Javascript 去除数组的重复元素
2010/05/04 Javascript
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
2017/03/17 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
解决Nuxt使用axios跨域问题
2020/07/06 Javascript
js实现可爱的气泡特效
2020/09/05 Javascript
Python开发编码规范
2006/09/08 Python
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
python实现跨文件全局变量的方法
2014/07/07 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
Python按钮的响应事件详解
2019/03/04 Python
Django中使用 Closure Table 储存无限分级数据
2019/06/06 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
python else语句在循环中的运用详解
2020/07/06 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
哈理工毕业生的求职信
2013/12/22 职场文书
酒店总经理欢迎词
2014/01/15 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书
教学反思怎么写
2016/02/24 职场文书
javascript之Object.assign()的痛点分析
2022/03/03 Javascript