散列函數:修订间差异
删除的内容 添加的内容
无编辑摘要 |
|||
(未显示25个用户的39个中间版本) | |||
第1行:
{{
{{NoteTA
|G1 = IT
|1 = zh-cn:健壮; zh-tw:強韌;
}}
'''散列函数'''({{lang-en|Hash function}})又称-{zh-cn:'''散列算法'''、'''哈希函数'''; zh-tw:'''雜湊演算法'''}-,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该[[函数]]将数据打乱混合,重新创建一个叫做'''散列值'''(又叫'''哈希值''')({{lang|en|hash values}},{{lang|en|hash codes}},{{lang|en|hash sums}},或{{lang|en|hashes}})的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。<ref>{{Cite book|title=The Crypto Encyclopedia: Coins, Tokens and Digital Assets from A to Z|last=Schueffel|first=Patrick|publisher=Growth Publisher|year=2019|isbn=|location=Bern, 瑞士|pages=|url=https://www.heg-fr.ch/media/lbdfnyd1/schueffelgroenewegbaldegger2019_crypto-encyclopedia_eng.pdf|last2=Groeneweg|first2=Nikolaj|last3=Baldegger|first3=Rico|access-date=2020-02-18|archive-date=2019-08-28|archive-url=https://web.archive.org/web/20190828012710/https://www.heg-fr.ch/media/lbdfnyd1/schueffelgroenewegbaldegger2019_crypto-encyclopedia_eng.pdf|dead-url=yes}}</ref>好的散列函数在输入域中很少出现[[碰撞_(计算机科学)|散列冲突]]。如果在[[散列表]]和[[数据处理]]中,不抑制冲突来区别数据,会使得[[数据库记录]]更难找到。
如今,雜湊演算法也被用來加密存在資料庫中的[[密碼]](password)字串,由於雜湊演算法所計算出來的'''雜湊值(Hash Value)'''具有'''不可逆'''(無法逆向演算回原本的數值)的性質,因此可有效的保護密碼。
[[File:Hash_function.svg|thumb|330px|right|散列函数的工作原理]]▼
== 散列函数的性质 ==
所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有[[确定性]]的结果,具有这种性质的散列函数称为单向散列函数。但另一方面,散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同,这种情况称为「[[雜湊碰撞]](collision)」,这通常是两个不同长度的输入值,刻意计算出相同的输出值。输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。
典型的散列函数都有非常大的[[定义域]],比如[[SHA-2]]最高接受(2<sup>64</sup>-1)/8长度的[[字节]][[字符串]]。同時散列函數一定有着有限的[[值域]],比如固定长度的[[位元|比特]]串。在某些情况下,散列函数可以设计成具有相同大小的定义域和值域间的[[單射]]。在密码学中,散列函數必須具有不可逆性。
== 散列函数的应用 ==
由于散列函数的应用的多样性,它们经常是专为某一应用而设计的。例如,[[加密散列函数]]假设存在一个要找到具有相同散列值的原始输入的敌人。一个设计优秀的加密散列函数是一个「单向」操作:对于给定的散列值,没有实用的方法可以计算出一个原始输入,也就是说很难伪造。为加密散列为目的设计的函数,如[[SHA-2]],被广泛的用作检验散列函数。這樣軟件下載的時候,就會對照驗證代碼之後才下載正確的文件部分。此代碼
▲由于散列函数的应用的多样性,它们经常是专为某一应用而设计的。例如,[[加密散列函数]]假设存在一个要找到具有相同散列值的原始输入的敌人。一个设计优秀的加密散列函数是一个「单向」操作:对于给定的散列值,没有实用的方法可以计算出一个原始输入,也就是说很难伪造。为加密散列为目的设计的函数,如[[SHA-2]],被广泛的用作检验散列函数。這樣軟件下載的時候,就會對照驗證代碼之後才下載正確的文件部分。此代碼有可能因為環境因素的變化,如機器配置或者IP地址的改變而有變動。以保證源文件的安全性。
错误监测和修复函数主要用于辨别数据被随机的过程所扰乱的事例。当散列函数被用于校验和的时候,可以用相对较短(但不能短於某個安全參數, 通常不能短於160位)的散列值来验证任意长度的数据是否被更改过。
===
{{main|
雜湊值可用於唯一地識別機密資訊。這需要雜湊函式是抗碰撞(collision-resistant)的,意味著很難找到產生相同雜湊值的資料。雜湊函式分類為密碼雜湊函式和可證明的安全雜湊函式。第二類中的函式最安全,但對於大多數實際目的而言也太慢。透過生成非常大的雜湊值來部分地實現抗碰撞。例如,SHA-256是最廣泛使用的密碼雜湊函式之一,它生成256位元值的雜湊值。
=== 确保传递真实的信息 ===
第28行 ⟶ 第29行:
=== 散列表 ===
{{main|散列表}}
第40行:
=== 错误校正 ===
{{main|错误校正与检测}}
第48行 ⟶ 第47行:
=== 语音识别 ===
对于像从一个已知列表中匹配一个MP3文件这样的应用,一种可能的方案是使用传统的散列函数——例如[[MD5]],但是这种方案会对时间平移、CD读取错误、不同的音频压缩算法或者音量调整的实现机制等情况非常敏感。使用一些类似于MD5的方法有利于迅速找到那些严格相同(从音频文件的二进制数据来看)的音频文件,但是要找到全部相同(从音频文件的内容来看)的音频文件就需要使用其他更高级的算法了。
那些并不紧随IT工业潮流的人往往能反其道而行之,对于那些微小差异足够健壮的散列函数确实存在。现存的绝大多数散列算法都是不够健壮的,但是有少数散列算法能够达到辨别从嘈杂房间里的扬声器里播放出来的音乐的健壮性。有一个实际的例子是[[Shazam Entertainment|Shazam]][http://www.shazam.com/] {{Wayback|url=http://www.shazam.com/ |date=20080821140538 }} 服务。用户可以用手机打开其app,并将话筒靠近用于播放音乐的扬声器。该项服务会分析正在播放的音乐,并将它于存储在数据库中的已知的散列值进行比较。用户就能够收到被识别的音乐的曲名。
==
[[Rabin-Karp字符串搜索算法]]是一个相对快速的[[字符串搜索算法]],它所需要的平均搜索时间是[[大O符号|O(n)]].这个算法是建立在使用散列来比较字符串的基础上的。▼
{| class="wikitable"
!演算法名稱
!輸出大小([[位元|bits]])
!內部大小
!區塊大小
!長度大小
!字符尺寸
!碰撞情形
|- align="center"
| '''[[HAVAL]]''' || 256/224/192/160/128 || 256 || 1024 || 64 || 32 || 是
|- align="center"
| '''[[MD2]]''' || 128 || 384 || 128 || No || 8 || 大多數
|- align="center"
| '''[[MD4]]''' || 128 || 128 || 512 || 64 || 32 || 是
|- align="center"
| '''[[MD5]]''' || 128 || 128 || 512 || 64 || 32 || 是
|- align="center"
| '''[[PANAMA]]''' || 256 || 8736 || 256 || 否 || 32 || 是
|- align="center"
| '''[[RadioGatún]]''' || 任意長度 || 58字 || 3字 || 否 || 1-64 || 否
|- align="center"
| '''[[RIPEMD]]''' || 128 || 128 || 512 || 64 || 32 || 是
|- align="center"
| '''[[RIPEMD|RIPEMD-128/256]]''' || 128/256 || 128/256 || 512 || 64 || 32 || 否
|- align="center"
| '''[[RIPEMD|RIPEMD-160/320]]''' || 160/320 || 160/320 || 512 || 64 || 32 || 否
|- align="center"
| '''[[SHA-0]]''' || 160 || 160 || 512 || 64 || 32 || 是
|- align="center"
| '''[[SHA-1]]''' || 160 || 160 || 512 || 64 || 32 || 有缺陷
|- align="center"
| '''[[SHA-2|SHA-256/224]]''' || 256/224 || 256 || 512 || 64 || 32 || 否
|- align="center"
| '''[[SHA-2|SHA-512/384]]''' || 512/384 || 512 || 1024 || 128 || 64 || 否
|- align="center"
| '''[[Tiger (cryptography)|Tiger(2)-192/160/128]]''' || 192/160/128 || 192 || 512 || 64 || 64 || 否
|- align="center"
| '''[[WHIRLPOOL]]''' || 512 || 512 || 512 || 256 || 8 || 否
|}
=== Rabin-Karp字符串搜索算法 ===
▲[[Rabin-Karp算法|Rabin-Karp字符串搜索算法]]是一个相对快速的[[字符串搜索算法]],它所需要的平均搜索时间是[[大O符号|O(n)]]
== 参阅 ==
* [[SHA家族]]
* [[BLAKE]]
== 参考文献 ==
=== 引用 ===
{{Reflist}}
===
{{ReflistH}}
* [https://web.archive.org/web/20050530071005/http://www.extra.research.philips.com/natlab/download/audiofp/cbmi01audiohashv1.0.pdf Robust Audio Hashing for Content Identification]
{{ReflistF}}
== 外部链接 ==
* [http://www.sigma.me/2011/09/13/hash-and-bloom-filter.html Hash和Bloom Filter介绍] {{Wayback|url=http://www.sigma.me/2011/09/13/hash-and-bloom-filter.html |date=20111020130547 }}
* [http://www.partow.net/programming/hashfunctions/index.html General purpose hash function algorithms C/C++/Pascal/Java/Ruby] {{Wayback|url=http://www.partow.net/programming/hashfunctions/index.html |date=20060618031431 }}
* [http://burtleburtle.net/bob/hash/evahash.html Hash Functions for Hash Table Lookup] {{Wayback|url=http://burtleburtle.net/bob/hash/evahash.html |date=20160112012118 }} by Bob Jenkins
* [http://www.azillionmonkeys.com/qed/hash.html 散列函数] {{Wayback|url=http://www.azillionmonkeys.com/qed/hash.html |date=20060615013036 }}by Paul Hsieh
* [https://web.archive.org/web/20061206022506/http://www.rsasecurity.com/rsalabs/node.asp?id=2176 什么是散列函数?] from RSA Laboratories
* [http://
* [http://3amsystems.com/monetics/crypto.php Crypto-Toolbox] {{Wayback|url=http://3amsystems.com/monetics/crypto.php |date=20080828022508 }} - Online cryptography, hashing and PIN block sanity checking for EftPos developers.
* [
[[Category:搜尋演算法]]
[[Category:错误检测与校正]]
[[Category:散列函数| ]]
[[Category:散列|*]]
|