【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'))
  • 运行结果:

【JS】数据结构之哈希表_第1张图片

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

【JS】数据结构之哈希表_第2张图片

你可能感兴趣的:(数据结构,数据结构,javascript,散列表,哈希)