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实现iframe动态调整高度的代码
Jan 06 Javascript
JS弹出层的显示与隐藏示例代码
Dec 27 Javascript
图片翻转效果具体实现代码
Jan 09 Javascript
Array 重排序方法和操作方法的简单实例
Jan 24 Javascript
Jquery节点遍历next与nextAll方法使用示例
Jul 22 Javascript
浅谈重写window对象的方法
Dec 29 Javascript
javasript实现密码的隐藏与显示
May 08 Javascript
vue货币过滤器的实现方法
Apr 01 Javascript
JS构造一个html文本内容成文件流形式发送到后台
Jul 31 Javascript
Vue开发中遇到的跨域问题及解决方法
Feb 11 Javascript
vue中如何自定义右键菜单详解
Dec 08 Vue.js
js仿淘宝放大镜效果
Dec 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
PHP模板引擎SMARTY
2006/10/09 PHP
又一个php 分页类实现代码
2009/12/03 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
node.js中的fs.fchownSync方法使用说明
2014/12/16 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
理解python多线程(python多线程简明教程)
2014/06/09 Python
Python日志模块logging简介
2015/04/13 Python
python3.6的venv模块使用详解
2018/08/01 Python
python实现根据指定字符截取对应的行的内容方法
2018/10/23 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
详解Python实现进度条的4种方式
2020/01/15 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
英国在线发型和美容产品商店:Beauty Cutie
2019/04/27 全球购物
德国网上超市:myTime.de
2019/08/26 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
什么是规则表达式
2012/05/03 面试题
倡议书格式范文
2014/04/14 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
党员四风问题对照检查材料
2014/09/27 职场文书
会计工作检讨书
2015/02/19 职场文书
跑出一片天观后感
2015/06/08 职场文书
工作会议简报
2015/07/20 职场文书
你真的会用Mysql的explain吗
2022/03/31 MySQL