【JS】数据结构之哈希表

文章目录

哈希

hash(哈希):一般翻译为散列,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出的值就是散列值。

这种转换是一种压缩映射,映射表达是一一对应的关系,也就是说,散列值的空间通常会小于输入的空间。

  • 哈希的不可逆性:
- 哈希算法不能从结果去推断出输入,也就是说哈希算法是不可逆的。

- 哈希算法可以当作一种加密算法存在,比如 MD5 就是不可逆的,以对比的方式进行效验。

- 常见的哈希算法有:MD2MD4MD5SHA1SHA256SHA512
  • 哈希用途:
1. 对密码进行加密保护:
- 哈希算法不可逆,用于密文保存密码的签名,网站后台只保存签名值。 
- 这样即使网站保存的信息被盗取,也无法获取用户的密码,具有更高的安全性。

2. 它可以检验文件信息是否是相同的,这样的优势是可以节省重复数据传送的时间。
- 就像我们在一些网盘中上传的文件,如果文件内容相同的话,
- 哪怕属于不同的用户,也可以通过对比哈希值避免向服务器重复上传相同的文件,
- 可以很大程度上节约存储资源,提高存储效率。

数组的查询:如果是基于索引,性能不错,如果是基于内容,性能就比较低了

const arr = [
	{name: 'aa', age: 1},
	{name: 'bb', age: 2},
]
// 通过索引的方式,查询效率很高
console.log(arr[0].name)

// 内容查询
arr.forEach((item)=>{
	if(item.name === 'aa'){
		console.log(item.name)
	}
})

哈希表

那有没有一种方法,可以直接将 name 值作为索引,来提高我们的查询速度,那么我们就要将 name 转换成数组的索引。这个东西就是哈希表。

哈希表通常是基于数组实现的,哈希表是对于索引的一种转换,这种转换称之为哈希函数,通过哈希函数就会把要存储的值映射到一个位置,这个位置就是他的索引。比如传一个字符串进来,就会把它映射成为数字。

  • 哈希表是以键值对的形式存储的数据结构,不同的是:
哈希表的键是经过哈希函数计算得到的*关键码*,每一个关键码对应一个值。

这种*关键码-*的形式存储数据的数组就是哈希表(散列表)。

相对于数组,它可以提供非常快速的插入-删除-查找操作。
  • 示例:js 实现一个极简版的哈希表
class HashTable {
	constructor(){
		this.table = []; // 哈希表
	}
	// 哈希函数(这里只是简单实现一下,实际上的hash函数会复杂的多)
	loseloseHashCode(key){
		let hash = 0;
		for(let i = 0; i < key.length; i++){
			hash += key[i].charCodeAt(); // 计算key unicode编码
		}
		// 取模
		return hash % 37;	// 37是质数,可以很大程度上避免碰撞
	}
	// 新增元素
	put(key, value){
		// 获取索引key值
		const position = this.loseloseHashCode(key);
		// 然后把value值根据hash函数获取到的key值,填充到对应的索引位置
		this.table[position] = value;
	}
	// 移除元素
	remove(key){
		const position = this.loseloseHashCode(key);
		this.table[position] = undefined;
	}
	// 获取元素
	get(key){
		const position = this.loseloseHashCode(key);
		return this.table[position];
	}
}
const hashtable = new HashTable();
hashtable.put('name','aa')
hashtable.put('age',18)
console.log(hashtable)
console.log(hashtable.get('name'))
  • 运行结果:

在这里插入图片描述

在web架构中,后端程序直接与数据库打交道,会出现频繁操作数据库情况,所有会出现性能瓶颈,于是就出现了缓存层。最开始是没有这个缓存层的,所以我们就得使用哈希表去设计这种缓存层。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗不甘坠落的流星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值