javascript 散列表(Hashes)算法与说明

Map和Set的本质:JavaScript原生集合类型的语义、性能与工程实践 Map和Set是JavaScript中基于数学集合论与SameValueZero相等算法设计的原生集合类型,区别于Object和Array的通用容器语义。其核心原理在于支持任意类型键(包括对象、函数)、严格遵循插入顺序、提供O(1)平均时间复杂度的查找与去重,并天然适配弱引用(WeakMap)与浮点数精确语义(+0/-0区分、NaN自等)。技术价值体现在内存可控性、运行时可预测性及防原型污染等工程鲁棒性上;典型应用场景涵盖状态管理、LRU缓存、权限校验、多维索引及图结构建模。本文深入解析Map与Set不可替 阅读详情

散列表的介绍

散列算法的作用是尽可能快地在数据结果中找到一个值,通常在数据结果中获得一个值(get方法),需要遍历整个数据结构来找到它。如果使用散列函数,就知道值的具体位置,因此能够快速检索到该值。散列函数的作用是给定一个键值,然后返回值在表中的地址。

现实实例,就如email记录本。键名就如用户名,值为email,然后当我们每保存一条数据的时候。通过键名用ASCII来转换成散列函数。如下图:


散列图算法详讲

首先我们通过添加3条数据,来生成一个散列图:

var hash = new HashTable();
hash.put('Gandalf', 'gandalf@email.com');
hash.put('John', 'johnsnow@email.com');
hash.put('Tyrion', 'tyrion@email.com');


三条数据生成的hash函数:

19-Gandalf
29-John
16-Tyrion

hashTable类在本文最底部。

下图显示整个操作流程:


成功生成一个散列图后,我们对他进行一些操作看看:

hash.get('Gandalf')//gandalf@email.com
hash.remove('Gandalf');
hash.get('Gandalf')//undefined

散列函数方法

散列函数算法有很多种,给大家认识的有“lose lose”散列函数,还有djb2散列函数。因为计算散列函数的时候,有可能2个不一样的值算出一样的值,这样导致散列表产生冲突。因此为乐避免冲突,我们需要优化散列方法也就是djb2散列函数。

var loseloseHashCode = function (key) {
    var hash = 0;
     for (var i = 0; i < key.length; i++) {
         hash += key.charCodeAt(i);
     }
     return hash % 37;
 };

 var djb2HashCode = function (key) {
     var hash = 5381;
     for (var i = 0; i < key.length; i++) {
         hash = hash * 33 + key.charCodeAt(i);
     }
     return hash % 1013;
 };

djb2数发为,初始一个hash值为5381(大多数推荐使用这值),然后送代参数key,将hash与33相乘(用来当作一个魔力数),并和当前送代到的字符ASCII玛相加。最后我们将使用相加的和与另一个随机质数相除得余数。

用上面3条数据再试一下:

//loselose算法:
19-Gandalf
29-John
16-Tyrion

//djb2算法:
798-Gandalf
838-John
624-Tyrion

这里我通过修改hash函数的算法来减少冲突,但其他还有其他办法可以减少冲突,如分离链接和线性探索等。有兴趣的朋友可以搜索一下学习下。


ES6散列表完整实现代码:

let HashTable = (function(){

    const table = [];

    class HashTable {
       constructor () {
       }

       loseloseHashCode(key) {//获取hash函数loselose算法
            var hash = 0;
            for (var i = 0; i < key.length; i++) {
                hash += key.charCodeAt(i);
            }
            return hash % 37;
        }

        djb2HashCode(key) {//获取hash函数djb2算法
            var hash = 5381;
            for (var i = 0; i < key.length; i++) {
                hash = hash * 33 + key.charCodeAt(i);
            }
            return hash % 1013;
        }

        hashCode(key) {//获取散列函数
            return this.loseloseHashCode(key);
        }

        put(key, value) {//插入数据
            var position = this.hashCode(key);
             console.log(position + ' - ' + key);
            table[position] = value;
        }

        get(key) {//返回特定值
            return table[this.hashCode(key)];
        }

        remove(key){//删除特定元素
            table[this.hashCode(key)] = undefined;
        }

        print() {//输出散列表
            for (var i = 0; i < table.length; ++i) {
                if (table[i] !== undefined) {
                    console.log(i + ": " + table[i]);
                }
            }
        }
     }
    return HashTable;
})()
前端项目-jshashes.zip 前端项目-jshashes,为服务器和客户端(MD5、Sha1、Sha256、Sha512、Ripemd、HMAC和Base64)实现了快速独立的哈希库纯JavaScript(符合ES3) 立即下载

相关推荐

Unity 2022打包Android APK:手把手教你创建和配置第一个签名Keystore(避坑指南)

本文详细介绍了Unity 2022打包Android APK时创建和配置签名Keystore的全流程,包括环境准备、Keystore创建、高级配置避坑指南以及签名验证与故障排查。特别强调了Android应用签名的重要性及安全维护策略,帮助开发者避免常见错误,确保应用顺利发布。

weixin_27379781的博客 241

爬虫登陆实战 --- QQ音乐扫码登陆

爬虫实战教程授人以鱼不如授人以渔开始实战准备工作抓取登陆包进行查看全部代码 授人以鱼不如授人以渔 爬虫教程千千万,总觉得市面的教程很少教到精髓。 这一期做一个本地扫码登陆获取Session的爬虫。 开始实战 准备工作 我们的目标是能够将QQ音乐的扫码登陆在本地执行。 也就是保存登陆二维码到本地,弹出二维码,若登陆成功后删除二维码,保留登陆信息。 我们首先写出显示二维码函数、删除二维码函数、保存二维码函数。 import sys import os import subprocess '''用于在不同O

一名新生程序员的日常 1万+

思科模拟器Cisco Packet Tracer交换机的管理配置

一、交换机的管理方式:带内管理和带外管理 通过交换机的 Console 端口管理交换机属于带外管理;这种管理方式不占用交换机的网络端口,第一次配置交换机必须利用 Console 端口进行配置。 通过 Telnet、拨号等方式属于带内管理。 二、控制台配置思科交换机 1.新建拓扑图 新建拓扑,选择console线连接交换机和PC,一端接交换机的console口,一端接PC的RS 232 口(...

qq_37992321的博客 2万+

JavaScript实现哈希表

1.1.认识哈希表哈希表通常是基于数组哈希表可以提供非常快速的插入-删除-查找操作;无论多少数据,插入和删除值都只需要非常短的时间,即O(1)的时间级。实际上,只需要几个机器指令即可完成;哈希表的速度比树还要快,基本可以瞬间查找到想要的元素。但是相对于树来说编码要简单得多。哈希表同样存在不足之处哈希表中的数据是没有顺序的,所以不能以一种固定的方式(比如从小到大 )来遍历其中的元素。通常情况下,哈希表中的key是不允许重复的,不能放置相同的key,用于保存不同的元素。哈希表是什么?

qwe02315的博客 496

JetLinks社区版VS企业版:手把手教你用PostgreSQL+Redis搭建物联网中台(Win7实测)

本文详细对比了JetLinks社区版与企业版的核心差异,并提供了在Windows 7系统上,使用PostgreSQL和Redis搭建物联网中台的完整部署教程。文章深入解析了从环境准备、后端服务构建到前端部署的每一步,为开发者在资源有限环境下构建高性价比物联网平台提供了清晰的实战指南。

w1x2y3的博客 304

ALSA音频开发实战:如何用snd_pcm_avail避免缓冲区溢出(附完整代码)

本文深入探讨了在ALSA音频开发中,如何利用`snd_pcm_avail`函数有效管理环形缓冲区,从而避免音频数据溢出或下溢。通过实战代码示例,详细解析了该函数在播放场景下的核心作用,即实时查询可写入的帧数,并构建了自适应写入循环以实现稳健的流量控制,确保音频流的平滑与稳定。

weixin_29183637的博客 461

前后端演示SHA1,MD5加密登录(带数据库)

SHA1,MD5简介安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。MD5将整个文件当作

j_bleach的博客 2224

用Python+NumPy手把手实现分数阶傅里叶变换(FRFT),搞定线性调频信号分析

本文详细介绍了如何使用Python和NumPy实现分数阶傅里叶变换(FRFT),特别针对线性调频信号(Chirp信号)分析。通过从零开始的代码实现和可视化案例,展示了FRFT在时变信号处理中的强大能力,帮助工程师和研究人员高效分析频率随时间变化的信号。

weixin_29062823的博客 217

终极指南:如何使用baseAdapter轻松实现Android多类型Item布局

baseAdapter是Android开发中一款功能强大的万能适配器,专为ListView、RecyclerView和GridView等组件设计,尤其擅长处理多种Item类型的复杂布局场景。本文将通过详细步骤和实战案例,教你如何快速掌握这一工具,让你的Android界面开发效率提升300%! ## 为什么选择baseAdapter? 在Android开发中,我们经常需要展示包含不同类型数据的列

gitblog_00012的博客 431

思必驰离线语音芯片:智能家居控制的核心引擎

思必驰离线语音芯片TH1520通过本地化语音识别技术,为智能家居带来革命性体验。该芯片具备200-600毫秒的快速响应、75分贝抗噪能力和双核异构设计,显著提升设备交互效率。支持自定义指令和10种音色选择,开发周期缩短至3天,BOM成本降低30%,是智能家居控制的核心引擎。

redis7keeper的博客 985

VUE3 实战手记(一)集成 EasyUI for Vue 组件库

本文详细介绍了如何在VUE3项目中集成EasyUI for Vue组件库,包括环境准备、基础安装、配置与集成、TypeScript类型问题解决以及组件实战等内容。EasyUI以其轻量级和开箱即用的特性,特别适合快速开发后台管理系统,提升开发效率。

weixin_30628801的博客 529

JavaScript:哈希表

JavaScript:哈希表(242. 有效的字母异位词,349. 两个数组的交集,1. 两数之和,第454题.四数相加II,总结:什么是哈希表?什么时候使用哈希表?使用哈希法中的数据结构,js里面Set的使用方法,js里面Map的使用方法)

weixin_51249285的博客 1687

量化之趋势跟踪策略

趋势跟踪策略 import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns from finance import GetData import warnings; warnings.filterwarnings('ignore') data = GetData.get_data('../data/002236.csv') .

木头大左的博客 2533

[Javascript Data Structures] HashTable 哈希表

(1) 字典 键值对[key, value]<script type="text/javascript"> function Dictionary(){ var obj={}; // 设置值 this.set=function(index,value){ obj[index]=value; } //

linjiayuqazwsx的博客 422

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

javascript权威指南第七版_JavaScript 数据结构和算法专栏目录

数组 Array栈 Stacks队列 Queues and Deques链表 Linked Lists集合 Sets字典和哈希表 Dictionaries and Hashes递归 Recursion树 Trees二叉堆和堆排序 Binary Heap and Heap Sort图 Graphs排序和搜索算法 Sorting and Searching Algorithms算法复杂度 Algori...

weixin_36034883的博客 652

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

How do I sort an array of hashes by a value in the hash?

url_hash.sort_by {|k| k["title"]} http://stackoverflow.com/questions/3154111/how-do-i-sort-an-array-of-hashes-by-a-value-in-the-hash

shiralwz的专栏 476

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

[504]node.js应用Redis

Node.js下使用Redis,首先: 1、有一台安装了Redis的服务器,当然,安装在本机也行 2、本机,也就是客户端,要装node.js 3、项目要安装nodejs_redis模块 注意第 3 点,不是在本机安装就行了,而是说,要在项目中安装(引用)。 方法是,DOS窗口,在项目目录下,输入 npm install redis 这样就将nodejs_redis下载一份,放到当前目录下了。看看...

周小董 792

node js应用Redis初步

node js应用Redis初步

qq_44894655的博客 88

Redis 缓存:Node.js 中使用 Redis 存储与读取数据

对于高频读取但很少更新的数据,设置合理的 TTL(生存时间)以避免缓存雪崩。,因其支持 Promise 和更丰富的功能。安装 Redis 客户端库。

2501_93392889的博客 273

node.js应用Redis初步

node.js下使用Redis,首先:1、有一台安装了Redis的服务器,当然,安装在本机也行2、本机,也就是客户端,要装node.js3、项目要安装nodejs_redis模块注意第 3 点,不是在本机安装就行了,而是说,要在项目中安装(引用)。方法是,DOS窗口,在项目目录下,输入npm install redis这样就将nodejs_redis下载一份,放到当前目录下了。看看,多了一个文...

weixin_34344403的博客 281

node.js的redis模块样例

/** * Created with JetBrains WebStorm. * User: hexie * Date: 12-12-13 * Time: 上午10:17 * To change this template use File | Settings | File Templates. */ var redis = require('redis'); var redis

我叫河蟹 3230

Hash Tables in Javascript

/* * Hash Tables in Javascript * Thanks http://www.mojavelinux.com/articles/javascript_hashes.html */ function Hash() { this.length = 0; this.items = new Array(); for (var i = 0;...

weixin_30662011的博客 151

node.js应用Redis数据库

node.js下使用Redis,首先: 1、有一台安装了Redis的服务器,当然,安装在本机也行 2、本机,也就是客户端,要装node.js 3、项目要安装nodejs_redis模块 注意第 3 点,不是在本机安装就行了,而是说,要在项目中安装(引用)。 方法是,DOS窗口,在项目目录下,输入 npm install redis 这样就将nodejs_redis下载一份,...

92

Reflection in Javascript

原文 Reflection in Javascript It’s very easy to do reflection in Javascript. Reflection is when your code looks onto itself to discover its variables and functions. It allows two different Jav...

iteye_8675的博客 176
上一篇: javascript 集合(set)算法与说明
下一篇: javascript 二叉树(Trees)算法与说明
JarunWang
博客等级 码龄18年 57粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值