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 相关文章推荐
fckeditor 获取文本框值的实现代码
Feb 09 Javascript
动态创建样式表在各浏览器中的差异测试代码
Sep 13 Javascript
jquery Moblie入门—hello world的示例代码学习
Jan 08 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
Nov 04 Javascript
JS中FRAME的操作问题实例分析
Oct 21 Javascript
详解Matlab中 sort 函数用法
Mar 20 Javascript
js css+html实现简单的日历
Jul 14 Javascript
Vue.js第三天学习笔记(计算属性computed)
Dec 01 Javascript
js实现5秒倒计时重新发送短信功能
Feb 05 Javascript
React Form组件的实现封装杂谈
May 07 Javascript
Node.js+Express+Mysql 实现增删改查
Apr 03 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
Feb 12 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 flush()与ob_flush()的区别详解
2013/06/03 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
2015/02/02 PHP
javascript 面向对象的JavaScript类
2010/05/04 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
两种方法解决javascript url post 特殊字符转义 + &amp; #
2016/04/13 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
2016/06/13 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
Python运算符重载用法实例
2015/05/28 Python
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
基于python调用jenkins-cli实现快速发布
2020/08/14 Python
Python3获取cookie常用三种方案
2020/10/05 Python
浅析Python打包时包含静态文件处理方法
2021/01/15 Python
python中PyQuery库用法分享
2021/01/15 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
初中女生自我鉴定
2013/12/19 职场文书
物流司机岗位职责
2013/12/28 职场文书
创业计划书撰写原则
2014/01/25 职场文书
优秀志愿者事迹材料
2014/02/03 职场文书
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
会务接待方案
2014/02/27 职场文书
求职信模板
2014/05/23 职场文书
人力资源管理专业自荐书
2014/07/07 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
初中团支书竞选稿
2015/11/21 职场文书
OpenCV-Python使用cv2实现傅里叶变换
2021/06/09 Python
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS