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 相关文章推荐
IE 上下滚动展示模仿Marquee机制
Dec 20 Javascript
JavaScript获取FCK编辑器信息的具体方法
Jul 12 Javascript
公共js在页面底部加载的注意事项介绍
Jul 18 Javascript
jQuery中:first-child选择器用法实例
Dec 31 Javascript
Vue.js双向绑定实现原理详解
Dec 22 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
Jul 24 Javascript
详解EasyUi控件中的Datagrid
Aug 23 Javascript
解决IE7中使用jQuery动态操作name问题
Aug 28 jQuery
基于canvas粒子系统的构建详解
Aug 31 Javascript
微信小程序:数据存储、传值、取值详解
May 07 Javascript
少女风vue组件库的制作全过程
May 15 Javascript
vue遍历对象中的数组取值示例
Nov 07 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
在PWS上安装PHP4.0正式版
2006/10/09 PHP
ThinkPHP中关联查询实例
2014/12/02 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
Javascript引用指针使用介绍
2012/11/07 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
Ajax基础知识详解
2017/02/17 Javascript
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
2019/05/21 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
python self,cls,decorator的理解
2009/07/13 Python
Python通过正则表达式选取callback的方法
2015/07/18 Python
Python下载指定页面上图片的方法
2016/05/12 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
Python 调用 Windows API COM 新法
2019/08/22 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
Python实现密码薄文件读写操作
2019/12/16 Python
深入了解Python enumerate和zip
2020/07/16 Python
Scholastic父母商店:儿童书籍
2017/01/01 全球购物
美国第一个网上卖鞋零售商:OnlineShoes.com
2017/09/24 全球购物
德国孕妇装和婴童服装网上商店:bellybutton
2018/04/12 全球购物
查摆问题自我剖析材料
2014/08/18 职场文书
批评与自我批评总结
2014/10/17 职场文书
闪闪红星观后感
2015/06/08 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers
python requests模块的使用示例
2021/04/07 Python
Python 循环读取数据内存不足的解决方案
2021/05/25 Python