Performance in Practice of String Hashing Functions

Performance in Practice of String Hashing Functions

 

Abstract

总结了一组string hashing函数,研究其性能。通过对大key集合和小key集合的实验,以及对比标准的hash函数,表明我们的这组hash是可靠并有效的。

 

    Introduction

    String Hashing用于将一个string缩减为某个域范围上的伪随机数。用于编译器的符号表和password文件中,也用于拼写检查以及BLOOM FILTER中,还用于数据库索引以及各种操作中。

    hash性能首先取决于两个因素:溢出处理策略和hash函数的表现。对hash函数的性能分析的研究有【37101114】。但在这些研究中hashkey都假设为整数,但在实践中string经常是string。有一些文章也检验了特定的string hashing函数【1213】。

    本文给出了一组string hashing函数并用实验表明其性能可以达到预测。

    评估的方法:

  1. 查找的平均试探(probe)数,无论成功与否
  2. 最坏情况下的成功查找试探数。
  3.  

    定义一组string hashing function(SHF)要满足:均匀性,通用性,实用性,有效性

    均匀性(uniformity):每个key计算到hash表中的每个槽的概率应为1/T

    通用性:对于两个hash函数h1h2,计算出两个值s1s2,这两个值相等的概率不大于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) = hT

注意:在特定的T值下,最后一步的模操作可以用AND操作代替

在实验中,我们将结果放在32位的空间(一个int)中,使用5ASCII字符的key,设定4L71R3,这样可以充分利用每个bit提供的信息。

String hashing本质上有两种方法,一种是利用位操作直接将字符串变成一串bit;另一种是将string变成数字,使用整数操作。但使用大整数操作很费时间,最好不用。

我们的假设是随机选择位操作函数,从而达到均匀性的目的。

你可能感兴趣的:(C++,c,C#,performance)