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 相关文章推荐
W3C Group的JavaScript1.8 新特性介绍
May 19 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
May 23 Javascript
javascript对JSON数据排序的3个例子
Apr 12 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
Jun 10 Javascript
Vue-resource拦截器判断token失效跳转的实例
Oct 27 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
Dec 20 Javascript
vue中动态绑定表单元素的属性方法
Feb 23 Javascript
微信小程序项目实践之验证码倒计时功能
Jul 18 Javascript
vue组件实践之可搜索下拉框功能
Nov 25 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
Nov 27 Javascript
使用Vue.observable()进行状态管理的实例代码详解
May 26 Javascript
在HTML5 localStorage中存储对象的示例代码
Apr 21 Javascript
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 正则判断中文UTF-8或GBK的思路及具体实现
2013/11/26 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
php递归法读取目录及文件的方法
2015/01/30 PHP
PHP异常处理浅析
2015/05/12 PHP
php解析mht文件转换成html的实例
2017/03/13 PHP
Yii redis集合的基本使用教程
2020/06/14 PHP
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
微信小程序之数据绑定原理解析
2019/08/14 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
[04:19]DOTA2亚洲邀请赛 现场花絮
2015/03/11 DOTA
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
python中的闭包用法实例详解
2015/05/05 Python
Python基本语法经典教程
2016/03/11 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
python日志logging模块使用方法分析
2019/05/23 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
安全生产实施方案
2014/02/23 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL