hashmap 前篇

来源:互联网 发布:qq飞车紫焰战神数据 编辑:程序博客网 时间:2024/05/14 19:18

hashing(散列算法)

    散列(英语:Hashing)是电脑科学中一种对资料的处理方法,通过某种特定的函数/算法(称为散列函数/算法)将要检索的项与用来检索的索引(称为散列,或者散列值)关联起来,生成一种便于搜索的数据结构(称为散列表)。也译为散列。旧译哈希(误以为是人名而采用了音译)。                        它也常用作一种资讯安全的实作方法,由一串资料中经过散列算法(Hashing algorithms)计算出来的资料指纹(data fingerprint),经常用来识别档案与资料是否有被窜改,以保证档案与资料确实是由原创者所提供。    如今,散列算法也被用来加密存在数据库中的密码(password)字串,由于散列算法所计算出来的散列值(Hash Value)具有不可逆(无法逆向演算回原本的数值)的性质,因此可有效的保护密码。    散列函数是从某一类资料中提取的一个小的数字“指纹”。    使用散列的方式包括:        加密散列        在信息安全领域使用        散列表        关联数组        几何散列
比如,在数据库中存储一些人名,排列方式可能是下面这样:Abernathy, SaraEpperdingle, RoscoeMoore, WilfredSmith, David所有名字均按字母排序......可以利用这些名字本身来作为数据库的索引值。数据库搜索算法首先会逐个字符的进行名字的搜索,直到找到为止。但是如果利用散列法对每个名字进行了转换,就可能为数据库中的每一个名字产生一个四位的索引值,其中位数长度取决于数据库中到底有多少个人名,象下面这样:7864 Abernathy, Sara9802 Epperdingle, Roscoe1990 Moore, Wilfred8822 Smith, David等等......这样,下次搜索名字时,就先搜索哈希并对数据库中的每个值进行一一对应。通常来讲,寻找四位的数字比寻找未知长度的字符串要来得快得多。毕竟寻找数字时每一位只有10种可能,而名字的长度未定,且每一位都有26种可能。

散列算法编辑

    也称为哈希函数——哈希的英文意思为“无用信息”,因此哈希函数一词的由来可能是因为最终形成的哈希表里面是各种看起来[1]  。除用来快速搜索数据外,散列法还用来完成签名的加密解密工作,这种签名可以用来对收发消息时的用户签名进行鉴权。先用哈希函数对数据签名进行转换,然后将数字签名本身和转换后的信息摘要分别独立的发送给接收人。通过利用和发送人一样的哈希函数,接收人可以从数字签名获得一个信息摘要,然后将此摘要同传送过来的摘要进行比较,这两个值相等则表示数字签名有效。    利用哈希函数对数据库中的原始值建立索引,以后每获取一次数据时都要利用哈希函数进行重新转换。因此,哈希函数始终是单向操作。没有必要通过分析哈希值来试图逆推哈希函数。实际上,一个典型的哈希函数是不可能逆推出来的。好的哈希函数还应该避免对于不同输入产生相同的哈希值的情况发生。如果产生了哈希值相同的情况,称为冲突。可接受的哈希函数应该将冲突情况的可能性降到非常小。    一些相对简单的哈希函数编辑    1)余数法:先估计整个哈希表中的表项目数目大小。然后用这个估计值作为除数去除每个原始值,得到商和余数。用余数作为哈希值。因为这种方法产生冲突的可能性相当大,因此任何搜索算法都应该能够判断冲突是否发生并提出取代算法。    2)折叠法:这种方法是针对原始值为数字时使用,将原始值分为若干部分,然后将各部分叠加,得到的最后四个数字(或者取其他位数的数字都可以)来作为哈希值。    3)基数转换法:当原始值是数字时,可以将原始值的数制基数转为一个不同的数字。例如,可以将十进制的原始值转为十六进制的哈希值。为了使哈希值的长度相同,可以省略高位数字。    4)数据重排法:这种方法只是简单的将原始值中的数据打乱排序。比如可以将第三位到第六位的数字逆序排列,然后利用重排后的数字作为哈希值。    哈希函数并不通用,比如在数据库中用能够获得很好效果的哈希函数,用在密码学或错误校验方面就未必可行。在密码学领域有几个著名的哈希函数。这些函数包括 MD2、MD4以及MD5,利用散列法将数字签名转换成的哈希值称为信息摘要(message-digest),另外还有安全散列算法(SHA),这是一种标准算法,能够生成更大的(60bit)的信息摘要,有点儿类似于MD4算法。

参考文章:
https://baike.baidu.com/item/%E6%95%A3%E5%88%97%E6%B3%95/7878219?fr=aladdin&fromid=18082349&fromtitle=Hashing

https://zh.wikipedia.org/wiki/%E6%95%A3%E5%88%97

原创粉丝点击