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函数并用实验表明其性能可以达到预测。

评估的方法:

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

 

定义一组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变成数字,使用整数操作。但使用大整数操作很费时间,最好不用。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值