Performance in Practice of String Hashing Functions
Abstract
总结了一组string hashing函数,研究其性能。通过对大key集合和小key集合的实验,以及对比标准的hash函数,表明我们的这组hash是可靠并有效的。
Introduction
String Hashing用于将一个string缩减为某个域范围上的伪随机数。用于编译器的符号表和password文件中,也用于拼写检查以及BLOOM FILTER中,还用于数据库索引以及各种操作中。
hash性能首先取决于两个因素:溢出处理策略和hash函数的表现。对hash函数的性能分析的研究有【3,7,10,11,14】。但在这些研究中hash的key都假设为整数,但在实践中string经常是string。有一些文章也检验了特定的string hashing函数【12,13】。
本文给出了一组string hashing函数并用实验表明其性能可以达到预测。
评估的方法:
查找的平均试探( probe )数,无论成功与否 最坏情况下的成功查找试探数。
定义一组string hashing function(SHF)要满足:均匀性,通用性,实用性,有效性
均匀性(uniformity):每个key计算到hash表中的每个槽的概率应为1/T
通用性:对于两个hash函数h1和h2,计算出两个值s1和s2,这两个值相等的概率不大于1/T
实用性:hash函数应该适用于各种条件(如表大小,是否字符串,种子选择等)
有效性:速度
还有别的属性,如完美性,保序性等,此处不讨论
Classes of hashing functions
s = c1…cm表示m个字符的串,v表示速度,hi是计算i个字符后得到的hash值
下面是公式:
h(s,v) =
set h0 ← init(v)
for each character ci in s,
set hi ← step(I, hi-1,ci )
return h = final(hm, v)
如图,定义了三个函数init(), step(), final()
作者举例如下:
init(v) = 0
step(I, h, c) = h + c
final(h, v) = h
hash值可以通过modT来放到hash表中
下面是一些操作符号:
加法:+
乘法:*
异或:⊕
与:∧
或:∨
取模:‖
对值h左移b位:Lb(h)
对值h右移b位:Rb(h)
设计原则:尽可能少的减少运算;产生足够大的hash值;尽可能打乱输入的bit;充分利用每一个字符可能的贡献。因此应该多用左移或右移,但要少用AND等操作,因其会擦除信息。
设计出的函数如下:
Init(v) = v
Step(I, h, c) = h⊕(LL(h) + RR(h) + c)
Final(h, v) = h‖T
注意:在特定的T值下,最后一步的模操作可以用AND操作代替
在实验中,我们将结果放在32位的空间(一个int)中,使用5个ASCII字符的key,设定4≤L≤7,1≤R≤3,这样可以充分利用每个bit提供的信息。
String hashing本质上有两种方法,一种是利用位操作直接将字符串变成一串bit;另一种是将string变成数字,使用整数操作。但使用大整数操作很费时间,最好不用。
我们的假设是随机选择位操作函数,从而达到均匀性的目的。