猫史档案馆


[Rust]hashmap(哈希表/哈希映射)

用户:CaTionalCaTional查看:26 回复:7 评论:26 创建时间:2022-04-02T19:35:20


概念

假如现在有10个用户名和用户密码,你会如何存储这些信息?二位数组,你一定会毫不犹豫的回答出来。

但是啊,怎么可能这么简单呢?现在我们再输入10个用户名和密码,是不是意味着要修改代码中的数组数量呢?哎,那么这时候你就会想到vector了。可是啊,vector的速度太慢了,在我们验证密码正确时,一般都会去想遍历vector内的值,数量一多,反应速度自然就快不到那里去。但是你仔细回想一下,vector中是不是每个下标就对应一个值呢?

哈希表

哈希表就是类似vector的这么一个容器。一般使用哈希表时,会跳过遍历过程,直接通过下标去取出所需的值。假设现在有一个哈希表

hash = [

1:PRC

2:USA

3:UK]

这里面就有这些东西(意思是PRC的下标是1,以此类推)

我们需要取出USA然后丢到rubbish box,那么我们只需要知道下标,而不需要一个一个看,这些空间里面那个是USA。

哈希

哈希是一个过程,一般通过一定的算法将一串字符提取其中的信息输出,也就是散列算法。比如:我今天吃了番茄炒蛋饭。要怎么缩句?我吃饭了。哈希类似缩句,但是要更复杂点。一般常用的有MD5(1995年后被验证存在安全问题,所以现在都是用作信息摘要算法验证文件的正确性),SHA家族。

那么我们现在尝试一下刚开始的问题。

非哈希实现

user =[

1256 -》Henry

1356 -》Jack

]

相信你也发现问题了,假设我有两个用户的密码相同怎么办?

哈希实现(和上面是一样的内容)

user_hashmap=[

74e8384423928a9f31406f26d124ad82f8f4ff4e51120a8c4bff125喵467f87b -》848348709a8d150d14e3ec5fe17736062425db71b喵c754bd6f8dbe83410c55a

b26b33956cf5e09b9bda3f13e0f5c76b73e9d24f4f4d5a58bdd9de6b8e0a4d8c -》

56c5869b15e6a5975c7ac0c06b767e308c4c922e32456a15b4b09e44cb2f0a55

]

不难看出,通过hash实现的储存,不仅方便查找,而且在用户输入名字和密码时,将两个都转换成hash,一一对比,成功的就允许登陆就好了。节约了遍历时间。

 

这就是通过已学知识,得到新的领悟。

 


回复

上一页1 页 / 共 1下一页
yee089yee089

温馨提示:csp的初赛会考哈希,请各位严肃亿点()()

点赞0


评论


AlcalaAlcala

哈希表我喜欢用unordered_map(

点赞0


评论


CaTionalCaTional

声明:本人不会再在BCM和他的子平台发任何教程。

点赞0


评论


治愈绾兮治愈绾兮

AZ

点赞0


评论


屑老冯屑老冯

十分感谢,我需要。

 

点赞0


评论


小萝卜cXsQ小萝卜cXsQ

哈希表的每一个值的下标都是用哈希函数算出来的,哈希函数的计算方法一定程度上决定了哈希冲突产生的概率(哈希冲突就是两个值计算出来的下标一样),但是过“好”的哈希函数会使哈希表会产生过多空位,造成空间浪费,而哈希表的大小也会决定空位的多少。所以,哈希表是典型的用空间换时间

点赞0


评论


༺追梦の人༻༺追梦の人༻

额,再出一个二叉搜索树的教程

点赞0


评论