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 相关文章推荐
JS与C#编码解码
Dec 03 Javascript
实例说明为什么不要行内使用javascript
Apr 18 Javascript
JS是按值传递还是按引用传递
Jan 30 Javascript
JavaScript中String.match()方法的使用详解
Jun 06 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
Mar 06 Javascript
Vue中保存用户登录状态实例代码
Jun 07 Javascript
浅析JS抽象工厂模式
Dec 14 Javascript
React Native基础入门之初步使用Flexbox布局
Jul 02 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 Javascript
Vue数据绑定简析小结
May 07 Javascript
react-router-dom 嵌套路由的实现
May 02 Javascript
WebStorm中如何将自己的代码上传到github示例详解
Oct 28 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 魔术函数使用说明
2010/05/14 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
PHP向socket服务器收发数据的方法
2015/01/24 PHP
如何使用PHP对网站验证码进行破解
2015/09/17 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
2007/03/06 Javascript
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
简单的代码实现jquery定时器
2014/01/03 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
javascript编程开发中取色器及封装$函数用法示例
2017/08/09 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
vue后台管理之动态加载路由的方法
2018/08/13 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
用Python编写一个国际象棋AI程序
2014/11/28 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
python 伯努利分布详解
2020/02/25 Python
使用python求解二次规划的问题
2020/02/29 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
2020/05/26 Python
Python测试框架:pytest学习笔记
2020/10/20 Python
python Timer 类使用介绍
2020/12/28 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
师范毕业生求职自荐信
2013/09/25 职场文书
汽修专业学生自我鉴定
2013/11/16 职场文书
政府信息公开实施方案
2014/05/09 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
在vue中import()语法不能传入变量的问题及解决
2022/04/01 Vue.js
MySQL创建管理子分区
2022/04/13 MySQL