hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射。
,一般翻译做、,或音译为,是把任意长度的输入(又叫做预映射 pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
简介
hash 算法可以将一个数据转换为一个标志,这个标志和源数据的每一个字节都有十分紧密的关系。hash 算法还具有一个特点,就是很难找到逆向规律。
hash 算法是一个广义的算法,也可以认为是一种思想,使用 hash 算法可以提高存储空间的利用率,可以提高数据的查询效率,也可以做数字签名来保障数据传递的安全性。所以 hash 算法被广泛地应用在互联网应用中。
hash 算法也被称为散列算法,hash 算法虽然被称为算法,但实际上它更像是一种思想。hash 算法没有一个固定的公式,只要符合散列思想的算法都可以被称为是 hash 算法。
基本概念
若结构中存在和关键字 k 相等的记录,则必定在 f(k)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系 f 为散列函数(hash function),按这个事先建立的表为散列表。
对不同的关键字可能得到同一散列地址,即 key1≠key2,而 f(key1)=f(key2),这种现象称碰撞。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数 h(key)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。
若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(uniform hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。
散列表
散列表是散列函数的一个主要应用,使用散列表能够快速的按照关键字查找数据记录。(注意:关键字不是像在加密中所使用的那样是秘密的,但它们都是用来“解锁”或者访问数据的。)例如,在英语字典中的关键字是英文单词,和它们相关的记录包含这些单词的定义。在这种情况下,散列函数必须把按照字母顺序排列的字符串映射到为散列表的内部数组所创建的索引上。
散列表散列函数的几乎不可能/不切实际的理想是把每个关键字映射到的索引上(参考散列),因为这样能够保证直接访问表中的每一个数据。
一个好的散列函数(包括大多数加密散列函数)具有均匀的真正随机输出,因而平均只需要一两次探测(依赖于装填因子)就能找到目标。同样重要的是,随机散列函数几乎不可能出现非常高的冲突率。但是,少量的可以估计的冲突在实际状况下是不可避免的(参考生日悖论)。
在很多情况下,heuristic 散列函数所产生的冲突比随机散列函数少的多。heuristic 函数利用了相似关键字的相似性。例如,可以设计一个 heuristic 函数使得像 file0000.chk,file0001.chk,file0002.chk,等等这样的文件名映射到表的连续指针上,也就是说这样的序列不会发生冲突。相比之下,对于一组好的关键字性能出色的随机散列函数,对于一组坏的关键字经常性能很差,这种坏的关键字会自然产生而不仅仅在攻击中才出现。性能不佳的散列函数表意味着查找操作会退化为费时的线性搜索。
散列表(hash table,也叫哈希表),是根据关键码值(key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
扩展
md5、sha1 的破解
2004 年 8 月 17 日,在美国加州圣芭芭拉召开的国际密码大会上,山东大学王小云教授在国际会议上首次宣布了她及她的研究小组的研究成果——对 md5、haval-128、md4 和 ripemd 四个著名密码算法的破译结果。次年二月宣布破解 sha-1 密码。
命令描述
linux 命令——hash
hash 命令用来显示、添加和清除哈希表。该命令的语法格式如下所示。