《数据结构与算法JavaScript描述》散列(学习笔记C08)

【JS逆向学习】国家加密系列-SM算法实例 事实上从 2010 年开始,我国国家密码管理局就已经开始陆续发布了一系列国产加密算法,其中SM1、SM4、SM7、祖冲之密码(ZUC)是对称算法;SM2、SM9是非对称算法;SM3是哈希算法。目前,这些算法已广泛应用于各个领域中。其中。 阅读详情

相关概念

1.散列是一种常用的数据存储技术,散列后的数据可以快速地插入或取用。
2.散列使用的数据结构叫做散列表。
3.在散列表上插入、删除和取用数据都非常快,但是对于查找操作来说却效率低下。
4.我们的散列表是基于数组进行设计的。
5.使用散列表存储数据时,通过一个散列函数将键映射为一个数字,这个数字的范围是 0 到散列表的长度。

代码

// 散列

// 数组的长度需要是质数

// HashTable类(表示散列表)
function HashTable() {
    this.table = new Array(137)
//     this.simpleHash = simpleHash
    this.betterHash = betterHash
    this.showDistro = showDistro
    this.put = put
//     this.get = get
}

// 最简单的散列函数:除留余数法

// 键值为字符串时:每个字符的ASCII码值相加除以数组长度的余数
function simpleHash(data) {
    var total = 0
    for (var i=0; i<data.length; i++) {
        total += data.charCodeAt(i)
    }
    console.log('Hash value: ' + data + ' ->' + total)
    return total % this.table.length
}

// put() 将数据存入散列表
function put(data) {
    // this.simpleHash()返回键值为字符串时用除留余数法返回的键值
//     var pos = this.simpleHash(data)
    var pos = this.betterHash(data)
    this.table[pos] = data
}

// showDistro() 显示散列表中的数据
function showDistro() {
    var n = 0
    for (var i = 0; i < this.table.length; ++i) {
        if (this.table[i] != undefined) {
            console.log(i + ': ' + this.table[i])
        }
    }
}

// 测试
var someNames = ["David", "Jennifer", "Donnie", "Raymond",
"Cynthia", "Mike", "Clayton", "Danny", "Jonathan"]
var hTable = new HashTable()
for (var i = 0; i < someNames.length; ++i) {
    hTable.put(someNames[i])
}
hTable.showDistro()
// Clayton ->730 Raymond ->730 
// 这两个人名散列值一样,产生碰撞

// 改善散列函数来避免碰撞

// 避免碰撞:
// 确保散列表中用来存储数据的数组大小是给质数
// 比 100 大且不会让例 8-1 中的数据产生碰撞的第一个质数是 137
// 计算散列值的更好方法:霍纳算法
// 在此算法中,新的散列函数仍然先计算字符串中各字符的 ASCII 码值,不过求和时每次要乘以一个质数。

// 有时间可以想一下霍纳算法为什么这么做

function betterHash(string, arr) {
    const H = 37
    var total = 0
    for (var i = 0; i < string.length; ++i) {
        total += H*total + string.charCodeAt(i)
    }
    total = total % this.table.length
    if (total < 0) {
        total += this.total.length - 1
    }
    return parseInt(total)
}

// 测试
var someNames = ["David", "Jennifer", "Donnie", "Raymond","Cynthia", "Mike", "Clayton", "Danny", "Jonathan"]
var hTable = new HashTable()
for (var i = 0; i < someNames.length; ++i) {
    hTable.put(someNames[i])
}
hTable.showDistro()

// 散列化整型键

function getRandomInt(min, max) {
    return Math.floor(Math.random()*(max - min + 1))+min
}

function genStuData(arr) {
    for (var i = 0; i < arr.length; ++i) {
        var num = ''
        for (var j = 1; j <= 9; ++j) {
            num += Math.floor(Math.random()*10)
        }
        num += getRandomInt(50, 100)
        arr[i] = num
    }
}

var numStudents = 10;
var arrSize = 97;
var idLen = 9;
var students = new Array(numStudents);
genStuData(students);
console.log("Student data: \n");
for (var i = 0; i < students.length; ++i) {
    console.log(students[i].substring(0,8) + " " +
    students[i].substring(9));
}
console.log("\n\nData distribution: \n");
var hTable = new HashTable();
for (var i = 0; i < students.length; ++i) {
    hTable.put(students[i]);
}
hTable.showDistro();

// P94

未完待续P94

掌握JavaScript中的数据结构:树、集合与散列表 本文深入探讨了JavaScript中高级数据结构的实现与应用,包括双向链表、树形结构、集合与散列表。通过具体的代码示例与操作说明,展示了如何在不依赖原生实现的情况下,通过对象和函数手动构建这些结构,并探索它们在数据管理中的作用和优势。 阅读详情

相关推荐

C#集成Bartender:动态图片标签打印的实战与优化

本文详细介绍了在C#程序中集成Bartender实现动态图片标签打印的实战方法与优化策略。通过具名数据源绑定、图片对象尺寸控制等核心技巧,解决了动态图片显示/隐藏的难题,并提供了从模板设计、代码架构到性能优化、错误处理的全流程指南,帮助开发者构建稳定高效的工业级标签打印系统。

weixin_29216957的博客 431

数据结构-散列

散列是一种常用的数据存储技术, 散列后的数据可以快速的插入或取用. 散列使用的数据结构叫做 散列表 . 在散列表上插入、删除和取用的数据都非常快, 但是对于查找操作来说却效率低下, 比如查找一组数据中最大值和最小值. 这些操作得求助于其它数据结构, 二叉查找树就是一个很好的选择. 本章介绍如何实现散列, 以及了解什么时候应用散列存取数据....

weixin_34397291的博客 322

vba 修改下拉列表_Excel联想式下拉菜单制作教程II

?点击关注Excel表哥公众号上期我们分享了Excel联想式下拉菜单制作教程,可以简化大家在下拉菜单过长时的数据录入工作。文章末尾给大家提出了一个问题:为什么下拉列表数据源需要先排序?今天我们继续分享一个不用对数据源排序也能实现的下拉列表制作方法。先看最终的效果动图:今日分享难度指数:★★★★☆01创建辅助列在需要设置下拉列表的工作表中创建一列辅助列,如下图所示:在辅助列F3单元格输入下...

weixin_39593718的博客 1576

数据结构-散列(哈希)

数据结构-哈希表,javascript语言描述,持续更新中……

前端御书房 258

W25N01GV SPI NAND Flash驱动开发避坑指南:详解2KB缓冲区机制与状态寄存器正确用法

本文深入解析W25N01GV SPI NAND Flash芯片的2KB缓冲区机制与状态寄存器正确用法,提供STM32 HAL和ESP-IDF项目的实战解决方案。涵盖双阶段操作原理、状态寄存器深度解析、时序控制优化及跨平台驱动设计要点,帮助开发者避免常见错误并提升存储性能。

aizhouqian5537的博客 640

别再为CAD和GIS数据对不上而头疼了!一份完整的ArcGIS for AutoCAD坐标系定义与数据套合指南

本文详细介绍了如何通过ArcGIS for AutoCAD插件解决CAD与GIS数据坐标系不匹配的问题,实现数据的精准套合。文章从坐标系冲突分析、插件核心功能解析到五步标准化工作流,提供了完整的解决方案,帮助工程师和设计师提升跨平台协作效率。

weixin_42531886的博客 216

JavaScript数据结构 --- 散列

JavaScript数据结构 --- 散列 散列是一种常用的数据存储技术,散列后的数据可以快速地插入或取用,但查找操作却效率低下,这是可以依靠其他数据结构(例如二叉查找树)。 散列使用的数据结构叫散列表,这里的散列表是基于数组进行设计的。所有元素根据该元素对应的键(类型字典中的键),保存在数组的特定位置。使用散列表存储数据时,通过一个散列函数 将键映射为一个长度为 0 到散列表长度的数字。 一般来...

weixin_30814319的博客 199

上海计算机学会2020年5月月赛C++乙组T2经济普查

中国正在以前所未有的力度推进脱贫攻坚,国家计划在2020年使得在现行标准下的贫困人口实现全面脱贫,为此,需要对居民的经济状况进行普查。 题目描述 给定一个正整数n,表示人口数量。一开始,每个居民拥有的财产记为a1​,a2​,⋯,an​,财产可能发生两种变化: 一种来源于个体,由某个居民的经济活动而产生。在某个时刻,某个居民的财产会直接变成某个数值,可能升高也可能降低。 一种来源于政策,在某个时刻,国家会对财产低于某个标准线全部的居民,实施政策支持,使得他们的财产全部正好到达标准线。 给定这些变

长春高老师编程 908

资料分享:送你一本《数据结构与算法JavaScript描述》电子书!

数据结构 是掌握计算机编程必须具备的技能。通常情况下,我想掌握一门编程语言所用的方法就是利用这门语言把数据结构中线性表、栈、队列、字符串、动态数字、整数集合、树、图、搜索、排序等涉及的算法全部写一遍。写完之后,基本上就把这门语言搞定了。 今天给大家分享的就是我从网上找到的利用 JavaScript 语言来实现各种数据结构的算法,希望这本电子书对学习 JavaScript 想从事前端工作的读者有益。...

老马的程序人生 4380

文末含资料链接和视频讲解!YOLOv8+RepVGG+QueryDet小目标检测终极指南:从理论到实战,突破遥感图像检测难题

QueryDet(Query Detection)机制代表了目标检测领域的一个重要范式转变。传统的目标检测方法基于anchor或anchor-free的密集预测,需要为图像中的每个可能位置生成预测。而QueryDet采用了稀疏查询的方式,通过少量的可学习查询向量来直接预测目标。 这种设计灵感来源于Transformer架构中的注意力机制。在自然语言处理中,Transformer通过query-key-value机制实现了高效的序列建模。QueryDet将这一思想引入到目标检测中,将检测问题转化为查询匹配问

FJN110的博客 387

一种基于机载LiDAR点云电力线自动提取方法

文章目录一、引言二、算法实现2.1实现步骤2.2实现代码 一、引言 二、算法实现 2.1实现步骤 (1)首先采用首先采用高程滤波方法去除地面点和低矮地物点,滤波后的点云数据中除电力线点云外还含部分杆塔点、高植被点和噪声点。 (2)根据点云空间维度特征提取电力线点,使用空间密度聚类的方法实现单根电力线精确分离。 2.2实现代码 在这里插入代码片 ...

dayuhaitang1的博客 5171

《图解算法》学习笔记之散列表(hash table)

目录 散列函数 防止重复 将散列表用作缓存 小结 冲突 性能 填装因子 小结 示例代码 Python C++ C# JS Java 散列函数 散列函数准确地指出了价格的存储位置,你根本不用查找!之所以能够这样,具体原因如下。 散列函数总是将同样的输入映射到相同的索引。每次你输入avocado,得到的都是同一个 数字。因此,你可首先使用...

moonlightpeng的博客 836

【Docker】一招解决超时镜像超时报错:`ERROR: Get https://registry-1.docker.io/v2/`

Docker 镜像拉取超时或失败并不是 Docker 本身的缺陷,而是网络环境和默认配置在特定场景下的限制所导致的结果。通过本文的分析可以看到,问题的核心往往集中在三个方面:网络访问延迟、DNS 解析速度以及客户端默认超时时间。针对这些问题,最直接、有效的做法是使用国内镜像加速器,这不仅能够显著提升拉取速度,还能保证在企业内网或家庭网络中更加稳定

博客 1027

js数据结构-散列表(哈希表)

散列表 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。 我们从上图开始分析 有一个集合U,里面分别是1000,10,152,97...

weixin_34186931的博客 304

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JS 数据结构

JS 数据结构 data structure 数据结构 数组 array 链表 linked list 队列 queue 栈 stack 堆 heap 树 tree 散列(哈希) hash 图 graph 这部分内容需要不断复习,核心代码自己抄三次,需要默写关键逻辑 参考书 《学习JavaScript数据结...

MichaelAn的博客 361

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

算法与数据结构 - 散列表

我们先不管什么是哈希表,先来看下如果物品没有规律随即摆放会怎么样。比如此时我们有Java,C,C++,C#,Python,JS,Mysql,Go,Rust几本书,如果我们随即摆放并查找Rust,可能出现的最坏情况如下:由于没有规律,我们只能够进行按照已有顺序进行随机访问,经过9次才找到我们的目标书籍。但如果我们按照书籍的首字母进行归纳,然后再进行查找,最坏情况又会不同:我们仅需6次就可以完成之前需要9次查找就可以完成的工作。当然这时候会有小伙伴有疑问,如果我所有书籍首字母都不同怎么办?

xiaoai1994的博客 532

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Javascript数据结构

加入QQ群:864680898,一起学习进步!点击群名可查看本人网站,有最新文章! Javascript数据结构 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。记为:Data_Structure=(D,R),其中D是数据元素的集合,R是该集合中所有元素之间的关系的有限集合 数组 数组存储一系列同一种数据类型的值。但在JavaScript里,也可以在数组...

qq_42036203的博客 2134

js学习之数据结构和算法

js中的数据结构 1、列表   待办事项列表、购物清单、最佳十名榜单等等。   适用:     1)数据结构较为简单,     2)不需要在一个长序列中查找元素,或者对其进行排序 2、栈   一摞盘子 ----- 添加删除只能从最上面。   特点:栈被称为一种后入先出的数据结构。是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样...

agzs70106的博客 133

Java 国密算法 SM3 散列哈希使用

国密算法 SM3 散列哈希使用 文章目录国密算法 SM3 散列哈希使用引入依赖计算散列哈希 引入依赖 <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.65</version> </dependency> 计算散列哈希 BouncyCastlePro

RisenMyth的博客 3601

「算法与数据结构」从入门到进阶吐血整理推荐书单

一.入门系列 这些书籍通过图片、打比方等通俗易懂的方法来讲述,让你能达到懂一些基础算法,线性表,堆栈,队列,树,图,DP算法,背包问题等,不要求会实现,但是看过以下这些书对于之后实现算法打下坚实的思维基础。 很适合在闲暇之余拿出来阅读一番。 1.1 《啊哈!算法》 阅读链接:https://book.douban.com/s...

墨鱼菜鸡 1782

JavaScript 数据结构与算法(一):概述

数据结构与算法 程序设计 = 数据结构 + 算法 什么是数据结构和算法? 我们先来看 几个术语: 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。 可以比作图书馆中所有的书。 数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。 就是书。 数据项:一个数据元素可以由若干个数据项组成。 ...

Bule_daze的博客 378

视频教程-C语言开发之数据结构与算法三-大数据

C语言开发之数据结构与算法三 从事技术开发已经10年左右,拥有丰富的开发经验...

weixin_32394491的博客 228

Universal Modder 的 fal 资产生成管线:`um fal` 配方、fal MCP 配置与 fal_manifest.jsonl 可复现性

本篇围绕 Universal Modder 仓库中的 `fal-assets` 技能文档展开,讲解如何用 fal(fal.ai)的一把 API key 为 Mod 生成尚不存在的游戏资产——精灵图、图标、无缝贴图、PBR 材质、image-to-3D 模型、自动绑定、音效、音乐、语音与预告片片段。读完你可以掌握三条调用通道(fal MCP 发现层、`um fal` CLI 落盘层、`fal api

gitblog_00666的博客 320

SHA256安全散列算法的Javascript实现

SHA256安全散列算法的Javascript实现

steveqobs 3472

js数据结构与算法存储结构

数据结构(程序设计=数据结构+算法) 数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合。 传统上,我们把数据结构分为逻辑结构和物理结构。 逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题。 物理结构:是指数据的逻辑结构在计算机中的存储形式。 常用的数据结构有: 数组,队列(queue),堆(heap),栈(stack...

139

基于JavaScript实现MD5散列函数辅助计算器

因为最近在学信息加密技术,搞清楚了加密原理,但又不想手动去计算,所以就用JavaScript写了一个网页版的MD5散列函数的辅助计算器,计算器的输入与输出都是16进制形式。 当然,因为我需要的是每一轮每一步的结果,所以计算器每一次运行只能计算一步。 首先,MD5的散列原理: (1)填充消息:任意长度的消息首先需要进行填充处理,使得填充后的消息总长度与448模512同余。填充的方法是在消息后面添加一位1,后续都是0. (2)添加原始消息长度:在填充后的消息后面再添加一个64位的二进制整数表示填充前原始

嗜睡的博客 865
上一篇: 《数据结构与算法JavaScript描述》字典(学习笔记C07)
下一篇: 《数据结构与算法JavaScript描述》二叉树和二叉查找树(学习笔记C10)
magic-fish
博客等级 码龄9年 3粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值