Few people think more than two or three times a year. I've made an
international reputation for myself by thinking once or twice a week.
If we knew what it was we were doing, it would not be called research,
would it?
Website
sections
Home
Articles
Projects
Blog
Guoxue
About me
研究哈希函数
简介
hash 算法经常使用 ,不论是聚合分类也好 ,还是 mc 代码研究 ,或是 CAS 实现
中,hash 算法都起到了至关重要的作用。 如果已经把 hash从计算科学上转移到
纯粹的数学 问题来看待 ,那么 D.E.Knuth 的 TAOCP 第三卷 ,就是必读教材了 .
同时 ,在 Bob Jenkins 的网页上能看到很多 hash 相关的东西 .
用数学的言论来理解 hash 算法 ,实际就是为一个集合 A 里面的元素 ,找到一个
function f(A), 让其全部映射到另一个集合 B 中去 .而对于从 B 逆向回溯到 A
是基本不可能的事情 ,那么该 f 便是一种 hash 算法 .按照这种理解 ,将会存在如
下 两种情况 :
如果 A 元素个数大于 B 元素个数 ,那么由抽屉原理 ,必定存在两个或两
个以上的 A 中元素映射到了 B 中同一元素 ,这时 ,一个冲突便产生了 . 那
么也就是说 ,一种 将大范围的数据 hash 到一个小范围数据的 hash 算法 ,
是无法保证其安全性能的 .这时 ,应用的时候无非取决两个方面 :
o 其一,应用于安全加密领域 ,那么取决于是否有可能取到大范
围中超过或接 近小范围个数的值 ,如果不能 ,算法是否能近似保证
近难以产生冲突 ,这时 hash 存在是有意义的 .
o 其二 ,不需要很高的安全性能 ,只是应用于查找和检索 ,恰当选
择 primer,将 O(logA) 的复杂度 ,降低至 O(A/primer) 的复杂度 ,也
是可取的 .这时 ,hash 的另 一个特征便出现了 ,如果对于 A 中的元
素,均匀的映射到了 B 上,那么 ,在这种情 况下 ,该 hash 算法是优
秀的 .
第二,如果 A 元素个数小于 B 元素个数 ,这种 hash 是没有意义的 ,
原因很 简单 ,将 A 映射到 B 的目的就是减少处理 A 的复杂度的 .
综上 ,hash 应用于两类情况 ,区分好两类情况能更加有效的设计 hash 算法 ,同时
设 计 hash 算法还要考虑到算法的计算复杂度 ,也即计算机处理时长 .应用于安
全领域 的要考虑产生冲突的概率 ,是否逼近单向函数 ;应用于查找领域的需要
考虑 hash 是 否均匀分布 .也即 R.W.Floyed 给出的散列思想 :
一个好的 hash 算法的计算应该是非常快的
一个好的 hash 算法应该是冲突极小化
如果存在冲突 ,应该是冲突均匀化
其中第一点和机器相关 ,第二和第三点和数据相关 .