javascript的hashCode函数实现代码小结


Posted in Javascript onAugust 11, 2020

为了使用的方便,稍稍再改良了一下

function hashcode(str) {
 var hash = 0, i, chr, len;
 if (str.length === 0) return hash;
 for (i = 0, len = str.length; i < len; i++) {
  chr  = str.charCodeAt(i);
  hash = ((hash << 5) - hash) + chr;
  hash |= 0; // Convert to 32bit integer
 }
 return hash;
}

hashcode("this is a string")
//-1853110172

这里接受的参数是一个 String,其它类型怎么办?可以先做一个统一的处理,比如

hashcode(JSON.stringify(obj))
序列化之后再使用 hashCode 函数,基本所有类型数据都通吃,除了含有循环嵌套的对象。

PS:
函数实现中有一行使用了 “|” 运算符,只是利用 Bitwise 运算符转换参数为 32bit,用来确保结果是个 32位整数。

这里是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;
}

下面是其它网友的补充

hashCode = function(str){
  var hash = 0;
  if (str.length == 0) return hash;
  for (i = 0; i < str.length; i++) {
    char = str.charCodeAt(i);
    hash = ((hash<<5)-hash)+char;
    hash = hash & hash; // Convert to 32bit integer
  }
  return hash;
}

djb2Code = function(str){
  var hash = 5381;
  for (i = 0; i < str.length; i++) {
    char = str.charCodeAt(i);
    hash = ((hash << 5) + hash) + char; /* hash * 33 + c */
  }
  return hash;
}

sdbmCode = function(str){
  var hash = 0;
  for (i = 0; i < str.length; i++) {
    char = str.charCodeAt(i);
    hash = char + (hash << 6) + (hash << 16) - hash;
  }
  return hash;
}

loseCode = function(str){
  var hash = 0;
  for (i = 0; i < str.length; i++) {
    char = str.charCodeAt(i);
    hash += char;
  }
  return hash;
}

以上就是javascript的hashCode函数实现代码小结的详细内容,更多关于javascript hashCode的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript 获取图片颜色
Apr 05 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
Feb 01 Javascript
jQuery中remove()方法用法实例
Dec 25 Javascript
js如何判断输入字符串长度
Dec 16 Javascript
如何用angularjs制作一个完整的表格
Jan 21 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
Jun 08 Javascript
JavaScript实现简单的树形菜单效果
Jun 23 Javascript
使用异步controller与jQuery实现卷帘式分页
Jun 18 jQuery
详解node登录接口之密码错误限制次数(含代码)
Oct 25 Javascript
JavaScript实现文件下载并重命名代码实例
Dec 12 Javascript
使用webpack搭建pixi.js开发环境
Feb 12 Javascript
基于vue的video播放器的实现示例
Feb 19 Vue.js
vue axios封装httpjs,接口公用配置拦截操作
Aug 11 #Javascript
解决vue刷新页面以后丢失store的数据问题
Aug 11 #Javascript
封装 axios+promise通用请求函数操作
Aug 11 #Javascript
在vue中使用回调函数,this调用无效的解决
Aug 11 #Javascript
vue 调用 RESTful风格接口操作
Aug 11 #Javascript
vue之封装多个组件调用同一接口的案例
Aug 11 #Javascript
vue接口请求加密实例
Aug 11 #Javascript
You might like
php生成与读取excel文件
2016/10/14 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
php和html的区别点详细总结
2019/09/24 PHP
用javascript连接access数据库的方法
2006/11/17 Javascript
模仿百度三维地图的js数据分享
2011/05/12 Javascript
Jquery实现带动画效果的经典二级导航菜单
2013/03/22 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
2017/10/20 Javascript
vue购物车插件编写代码
2017/11/27 Javascript
JavaScript中的一些隐式转换和总结(推荐)
2017/12/22 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
利用Python如何生成hash值示例详解
2017/12/20 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
python 6种方法实现单例模式
2020/12/15 Python
python 制作网站小说下载器
2021/02/20 Python
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
毕业自我鉴定范文
2013/11/06 职场文书
安全事故检讨书
2014/01/18 职场文书
退休感言
2014/01/28 职场文书
计划生育诚信协议书
2014/11/02 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
Python+Appium自动化测试的实战
2021/06/30 Python
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android