散列函數:修订间差异

删除的内容 添加的内容
克索娜留言 | 贡献
无编辑摘要
无编辑摘要
 
(未显示20个用户的30个中间版本)
第1行:
{{mergefromredirect|散列}}
{{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|散列函数的工作原理]]
 
[[File:Hash_function.svg|thumb|330px|right|散列函数的工原理的例子]]
 
== 散列函数的性质 ==
第14行 ⟶ 第16行:
 
== 散列函数的应用 ==
由于散列函数的应用的多样性,它们经常是专为某一应用而设计的。例如,[[加密散列函数]]假设存在一个要找到具有相同散列值的原始输入的敌人。一个设计优秀的加密散列函数是一个「单向」操作:对于给定的散列值,没有实用的方法可以计算出一个原始输入,也就是说很难伪造。为加密散列为目的设计的函数,如[[SHA-2]],被广泛的用作检验散列函数。這樣軟件下載的時候,就會對照驗證代碼之後才下載正確的文件部分。此代碼有可能不会因為環境因素的變化,如機器配置或者IP地址的改變而有變動。以保證源文件的安全性。
 
错误监测和修复函数主要用于辨别数据被随机的过程所扰乱的事例。当散列函数被用于校验和的时候,可以用相对较短(但不能短於某個安全參數, 通常不能短於160位)的散列值来验证任意长度的数据是否被更改过。
第21行 ⟶ 第23行:
{{main|密碼雜湊函数}}
 
雜湊值可用於唯一地識別機密資訊。這需要雜湊函式是抗碰撞(collision-resistant)的,意味著很難找到產生相同雜湊值的資料。雜湊函式分類為密碼雜湊函式和可證明的安全雜湊函式。第二類中的函式最安全,但對於大多數實際目的而言也太慢。透過生成非常大的雜湊值來部分地實現抗碰撞。例如,SHA-2256是最廣泛使用的密碼雜湊函式之一,它生成256位元值的雜湊值。
 
=== 确保传递真实的信息 ===
第47行 ⟶ 第49行:
对于像从一个已知列表中匹配一个MP3文件这样的应用,一种可能的方案是使用传统的散列函数——例如[[MD5]],但是这种方案会对时间平移、CD读取错误、不同的音频压缩算法或者音量调整的实现机制等情况非常敏感。使用一些类似于MD5的方法有利于迅速找到那些严格相同(从音频文件的二进制数据来看)的音频文件,但是要找到全部相同(从音频文件的内容来看)的音频文件就需要使用其他更高级的算法了。
 
那些并不紧随IT工业潮流的人往往能反其道而行之,对于那些微小差异足够健壮的散列函数确实存在。现存的绝大多数散列算法都是不够健壮的,但是有少数散列算法能够达到辨别从嘈杂房间里的扬声器里播放出来的音乐的健壮性。有一个实际的例子是[[Shazam Entertainment|Shazam]][http://www.shazam.com/] {{Wayback|url=http://www.shazam.com/ |date=20080821140538 }} 服务。用户可以用手机打开其app,并将话筒靠近用于播放音乐的扬声器。该项服务会分析正在播放的音乐,并将它于存储在数据库中的已知的散列值进行比较。用户就能够收到被识别的音乐的曲名。
 
==目前常見的雜湊演算法==
 
{| 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://arquivo.pt/wayback/20100530092446/http%3A//home1.paulschou.net/tools/xlate/ Online Char(ASCII),HEX, Binary, Base64, etc... Encoder/Decoder with MD2, MD4, MD5, SHA1+2, etc. hashing algorithms]
* [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.
* [https://web.archive.org/web/20180620001154/https://passwordsgenerator.pro/sha256 Hash值在线计算]
 
[[Category:搜尋演算法]]
[[Category:错误检测与校正]]
[[Category:散列函数| ]]
[[Category:散列|*]]