用户:
CaTional查看: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,一一对比,成功的就允许登陆就好了。节约了遍历时间。
这就是通过已学知识,得到新的领悟。
小萝卜cXsQ哈希表的每一个值的下标都是用哈希函数算出来的,哈希函数的计算方法一定程度上决定了哈希冲突产生的概率(哈希冲突就是两个值计算出来的下标一样),但是过“好”的哈希函数会使哈希表会产生过多空位,造成空间浪费,而哈希表的大小也会决定空位的多少。所以,哈希表是典型的用空间换时间
点赞0
评论