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之卸载鼠标事件的代码
May 14 Javascript
Firefox+FireBug使JQuery的学习更加轻松愉快
Jan 01 Javascript
Extjs4 类的定义和扩展实例
Jun 28 Javascript
JavaScript 动态加载脚本和样式的方法
Apr 13 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
Nov 25 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
Oct 27 Javascript
vue检测对象和数组的变化分析
Jun 30 Javascript
微信小程序表单弹窗实例
Jul 19 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
Aug 01 Javascript
JavaScript学习教程之cookie与webstorage
Jun 23 Javascript
JS图片懒加载的优点及实现原理
Jan 10 Javascript
vue-cli中实现响应式布局的方法
Mar 02 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+jQuery实现自动补全功能源码
2013/05/15 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
php关闭warning问题的解决方法
2016/05/17 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
Javascript this 的一些学习总结
2012/08/31 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
JS实现的论坛Ajax打分效果完整实例
2015/10/31 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
利用jQuery对无序列表排序的简单方法
2016/10/16 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
Python语言技巧之三元运算符使用介绍
2013/03/04 Python
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
Python中设置变量访问权限的方法
2015/04/27 Python
在Python的列表中利用remove()方法删除元素的教程
2015/05/21 Python
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
对pandas的dataframe绘图并保存的实现方法
2017/08/05 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
2018/01/04 Python
在pytorch中对非叶节点的变量计算梯度实例
2020/01/10 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
大四学生思想汇报
2014/01/13 职场文书
安全生产责任书范本
2014/04/15 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
vue前端工程的搭建
2021/03/31 Vue.js