用户:
CaTional查看:344 回复: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,一一对比,成功的就允许登陆就好了。节约了遍历时间。
这就是通过已学知识,得到新的领悟。
yee089温馨提示:csp的初赛会考哈希,请各位严肃亿点()()
点赞0
评论
不至于
去年就考了()
当时我还被整蒙了
顶多是考哈希思想吧
不,给你一段数据和哈希的方法,然后让你填完成操作后的数列
我咋没看到这题?
maybe 我记错了()
哦,没有记错,2021的csp-s第6题,那一次我去-s看题了()
虽然题面记错了()
Alcala哈希表我喜欢用unordered_map(
点赞0
评论
哈希表的实现其实大同小异,rust社区也用别的hashmap实现,很少用STD,STD搞这个主要还是还有别的函数要调用。
std的sort和deque(vector)很良心(
社区放着更好的板条箱为什么不用呢?你现在随便去看一个rust项目都在用tokio,有谁在用官方的多线程?
看来您没打过OI()
打IO那就没办法了,STD的勉强用用吧
平板电视很好用
《std》是stl啊啊啊啊啊啊啊啊啊啊啊啊
stl的优点是肯定没有bug(),缺点是常数太大
csp和noi都是开O2的吧
csp应该没有这么良心()我不想开O2,因为之前差点因为这个tle过……
HHHHH,std是Rust的std。我从来没说这是C++,你没看见我已经标注了rust?rust除了std还有core。C++谁都知道只有stl.另外,大型比赛不会开O2和其他优化
会开o2好不好,还有除了stl比赛还能用平板电视啊
小萝卜cXsQ哈希表的每一个值的下标都是用哈希函数算出来的,哈希函数的计算方法一定程度上决定了哈希冲突产生的概率(哈希冲突就是两个值计算出来的下标一样),但是过“好”的哈希函数会使哈希表会产生过多空位,造成空间浪费,而哈希表的大小也会决定空位的多少。所以,哈希表是典型的用空间换时间
点赞0
评论
就目前储存空间而言,服务器1G一块钱这算不了什么钱。低延迟能够给用户和特定服务带来更好体验。是很划算的。