3个散列函数,用于最佳地为具有最小冲突的布隆过滤器滑动窗口字符串

时间:2011-01-09 20:27:21

标签: c#

我需要3个散列函数来散列在文本上移动的滑动窗口的字符串,以便稍后在bloom矢量中搜索。我在编程中使用C#

我读过关于滚动哈希函数和循环多项式的东西,它们用于滑动窗口应用程序。但实际上,我没有找到任何代码,它们只是描述

所以,如果有人知道3个最好的C#哈希函数用于固定大小(5-char)的滑动窗口字符串,它们消耗更少的时间并且具有最小数量的冲突,它们是滚动哈希函数或其他,请帮我一些C#代码或哈希函数名称的链接

字符串都是十六进制的,我的意思是仅包含(0-9)和(A-F)大写字母,以及短划线字符( - )...例如

我的字符串可以是AB-2C-65-ED-65

Duaa

1 个答案:

答案 0 :(得分:0)

只有阿尔法字符?上下?如果您只有5个不区分大小写的[a-z]字符,则可以通过26 < 2^5的位移来快速将它们打包成5 * 5 = 25位。因此,32位int可以将整个字符串打包为零哈希冲突。

<强> [编辑]

好的,既然你已经澄清了输入。

[0-9],[A-Z] + [' - ']是37个字符...超过32位字符限制5位。因此,您需要6位来存储每个char。幸运的是,即使有5个字符,总共只有6*5 = 30位,所以你可以将整个字符串完全打包成32位int,甚至不需要弄乱符号位,所以你会有一个非常快速,完全无损(零冲突)哈希码,唯一标识每个字符串......甚至可以反转!所有数字都是正数,因此如果需要,您可以为符号位指定一些其他含义。

以下是将[0-9],[a-z] + [' - ']范围内的5个字符打包成int的新函数。首先需要取Hex字符串并将其恢复到正常状态,然后通过下面的位进行操作。

string c; //This is your text to hash.

public override int GetHashCode()
{
    if (c.Length > 5) throw new InvalidOperationException("Sliding window string too long");

    const char dash = (char)45;
    //Pack all characters right-aligned within the int
    return (c[0]-dash << 24) | (c[1]-dash << 18) | (c[2]-dash << 12) | (c[3]-dash << 6) | c[4]-dash;
}

注意:您还可以安全地使用ASCII 45和ASCII 109之间的一些其他字符,如:“./:;<=>?[\]^_”而不修改此代码。