hash表学习(附自己写的简单源码)

本文介绍了哈希表的基本概念,包括其数据结构和算法特性,强调了其高效率查找。通过PHP函数存储的示例,指出哈希表效率取决于哈希函数的设计。提到了SHA1和MD5作为加密解密的例子,并展示了C和C++实现的哈希表代码,讨论了冲突解决方法,如链地址法。
摘要由CSDN通过智能技术生成

Hash表(哈希表) (hash法(哈希法),散列表,散列法)

通过一个例子了解hash法

它具备数据结构特性也具备算法特性

查找效率非常高

绝大多数编程语言都是用哈希表这种结构储存函数的代码

说一个梗:php是世界上最好的语言

说这个梗的原因是因为:php相比于其他语言编译器,它对函数存储的hash表是比较low的,或者说php所用的用来存储函数的hash法不是很好。

Hash表的效率取绝于你设置的hash法,你设置的hash法越好,效率也会越好。

它同样也是算法,主要用于加密解密(非对称加密)。

不论数据是什么,它会固定生成一个的一个串(原则上讲不同数据生成的串是不一样的),为什么叫非对称加密,因为它不能将串反向生成数据(它是单向的)。可以用来做验证。

举例:客户端写入的密码变成串,串与服务器密码库内的串做验证,是不是一样,一样即可通过验证

最具代表性的是sha1(Secure Hash Algorithm,安全散列算法),md5(Message Digest algorithm 5,信息摘要算法)(被誉为最安全的加密方式)

详情搜索sha1和md5查找相关消息

简单学习一下(因为太nb和大了):

当创建hash法的方式就有如图这么多

还有处理冲突的方式等等,范围很广也很多

所以该文章只是简单写一下:

首先需要了解的是hash法的三要素

  1. 数据的范围

  1. 合适的hash函数 查找数据的方式

  1. 返回数据存放地址

  1. 解决冲突的方法。

  1. 不同数据通过第二步的hash函数返回地址相同 要区分存储

举例:打败游戏boss,在那一瞬间计算出会爆出啥东西,然后渲染到客户端,速度很快,问题是客户端这边要把信息发给服务端,然后服务端要很快计算完发给客户端

比如掉金币,戒指,武器等等,他们每一个里面同时也包含了各种各样的数据

需要的效率是非常高的

所以我们需要一个很短的方式去描写很大数据的方式,所以要对这些进行分类

这样,不论啥玩意,用7个位描述清楚

举例:4 7 80 001就是道具,红色,80级,剑(假设001是剑)这样,以此类推

然后在这些数里面做随机,就会很快,这就是数据的范围

存储十进制整数:

用10个位置的数组,每个位存指针,指向下一个数组

比如要找编号567

则:

注意,指向的是数组(这样就不会很大,并且只需要3次寻址即可)

1000以内不冲突,但1w以内就会产生冲突

会发生冲突的可能是567,1567,2567,3567等等都在这个位置

解决冲突可以用链表,数组等等

三层数组利用十进制数组

可以搜索md5源码,是用数字的映射制作的,非常复杂(中间加了很多步骤,为的是难以解密以及冲突很小)

所以用存储数字的方式写一个hash看一看:

c语言写的hash:

c++写的hash:

在cpp的代码中可以在最后断点来看看:

c和c++的代码其实差不多,只不过是一些地方的区别。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

多方通行8

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

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

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

打赏作者

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

抵扣说明:

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

余额充值