Hash table

散列表

基本概念

散列表Hash table,也叫哈希表),是根据(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表

原理

散列表被用于大海捞针式的查找。

我们知道,简单查找算法的时间复杂度为O(n),二分查找的时间复杂度为O(logn),而散列表的时间复杂度为O(1)!!

来做一个比较,比如我们将所有商品的价格写在一个本子上,有顾客来买东西时,我们需要查找到对应商品的价格。

本子中的商品数量 Second Header 二分查找O(logn) 散列表O(1)
100 10s 1s 立即
1000 1.6min 1s 立即
10000 16.6min 2s 立即

散列函数

基本概念

散列函数,又称为散列算法,哈希函数。可以将一个任意的数据压缩为一个固定长度的字符串,这个字符串叫做散 列值,或者是消息摘要。所以,也可以叫做摘要算法。散列值通常用一个短的随机字母和数字组成的字符串来代 表。好的散列函数在输入域中很少出现散列冲突。

散列函数的性质

如果两个散列值不同,那么这两个散列值在进入散列函数之前的原始数据也必定不同。

origionA -> value1

origionB -> value2

value1 不等于 value2

所以origionA 也不可能等于origionB

具有这种性质的散列函数叫做单向散列函数。

但是,如果两个原始数据,不同,它们的输出值是可能相等的。

origionC -> value3

origionD -> value3

origionC 不等于 origionD,但是,它们两个通过散列函数计算后的值都是value3

这中情况被叫做"散列碰撞(collision)",这通常是两个不同长度的输入值,刻意计算出相同的输出值。

一个好的散列函数,是不能具有可逆性的,即我们不能通过输出值,来计算出原始数据。

常见的散列函数

目前流行的 Hash 算法包括 MD5、SHA-1 和 SHA-2。

MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。其输出为 128 位。MD4 已证明不够安全。

MD5(RFC 1321)是 Rivest 于1991年对 MD4 的改进版本。它对输入仍以 512 位分组,其输出是 128 位。MD5 比 MD4 复杂,并且计算速度要慢一点,更安全一些。MD5 已被证明不具备"强抗碰撞性"。

SHA (Secure Hash Algorithm)是一个 Hash 函数族,由 NIST(National Institute of Standards and Technology)于 1993 年发布第一个算法。目前知名的 SHA-1 在 1995 年面世,它的输出为长度 160 位的 hash 值,因此抗穷举性更好。SHA-1 设计时基于和 MD4 相同原理,并且模仿了该算法。SHA-1 已被证明不具"强抗碰撞 性"。

为了提高安全性,NIST 还设计出了 SHA-224、SHA-256、SHA-384,和 SHA-512 算法(统称为 SHA-2),跟 SHA-1 算法原理类似。SHA-3 相关算法也已被提出。

散列函数的应用

  1. 保护数据

    比如我们平时从网站上下载文件,文件的提供者同时会给出文件的md5值或sha256值,我们下载完成后,可以通过计算出文件的md5或sha256来和正确的值进行对比,实现防篡改的功能。

    还有就是我们平常在网站注册新用户时,数据库存放的并不是我们输入的密码的明文格式。我了解的大多数的方法是md5(password + salt),salt叫做加盐,是一个随机的值。如果不这样的话,那我们的个人数据还不满天飞。当然,就是有很多厂商,甚至是很多特别大的公司,竟然使用明文的格式存放用户的信息,真不知道怎么想的。

  2. 散列表

    散列表是散列函数的一个主要应用,能够让服务程序从大量的数据中快速的找到我们想要的信息。

  3. 错误矫正

    使用一个散列函数可以很直观的检测出数据在传输时发生的错误。在数据的发送方,对将要发送的数据应用散列函数,并将计算的结果同原始数据一同发送。在数据的接收方,同样的散列函数被再一次应用到接收到的数据上,如果两次散列函数计算出来的结果不一致,那么就说明数据在传输的过程中某些地方有错误了。这就叫做冗余校验。--维基百科

    个人感觉和第一个应用保护数据的思想差不多。。。

  4. 语音识别

    对于像从一个已知列表中匹配一个MP3文件这样的应用,一种可能的方案是使用传统的散列函数——例如MD5,但是这种方案会对时间平移、CD读取错误、不同的音频压缩算法或者音量调整的实现机制等情况非常敏感。使用一些类似于MD5的方法有利于迅速找到那些严格相同(从音频文件的二进制数据来看)的音频文件,但是要找到全部相同(从音频文件的内容来看)的音频文件就需要使用其他更高级的算法了。

    那些并不紧随IT工业潮流的人往往能反其道而行之,对于那些微小差异足够健壮的散列函数确实存在。现存的绝大多数散列算法都是不够健壮的,但是有少数散列算法能够达到辨别从嘈杂房间里的扬声器里播放出来的音乐的健壮性。有一个实际的例子是Shazam[1] 服务。用户可以用手机打开其app,并将话筒靠近用于播放音乐的扬声器。该项服务会分析正在播放的音乐,并将它于存储在数据库中的已知的散列值进行比较。用户就能够收到被识别的音乐的曲名 --维基百科

    我们平常使用的音乐软件上的听歌识曲就是这个应用。

散列表在Python中的实现

散列表在Python中是通过字典的形式组织的。

我们知道python字典的key是唯一的,这也就确保了查找的唯一性。

Text['method'] = 'md5'
Text['function'] = 'sha256'

print(Text['method'])

这里我只是对哈希表做了一个简单的介绍,接下来我会总结具体的哈希算法的实现,比如md5,sha256..

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342