Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 3个哈希函数,用于以最小冲突对bloom筛选器的滑动窗口字符串进行最佳哈希_C# - Fatal编程技术网

C# 3个哈希函数,用于以最小冲突对bloom筛选器的滑动窗口字符串进行最佳哈希

C# 3个哈希函数,用于以最小冲突对bloom筛选器的滑动窗口字符串进行最佳哈希,c#,C#,我需要3个散列函数来散列在文本上移动的滑动窗口的字符串,以便稍后在bloom向量中搜索。我在编程中使用C# 我读了一些关于滚动哈希函数和循环多项式的内容,它们用于滑动窗口应用程序。但实际上,我没有找到任何代码,它们只是描述 因此,如果有人对固定大小(5字符)的滑动窗口字符串使用的3个最佳C#hash函数有任何想法,它们消耗的时间更少,冲突次数最少,或者它们是滚动哈希函数或其他函数,请帮助我提供一些C#代码或哈希函数名称的链接 字符串都是十六进制的,我的意思是仅由(0-9)和(A-F)大写字母以及

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

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

因此,如果有人对固定大小(5字符)的滑动窗口字符串使用的3个最佳C#hash函数有任何想法,它们消耗的时间更少,冲突次数最少,或者它们是滚动哈希函数或其他函数,请帮助我提供一些C#代码或哈希函数名称的链接

字符串都是十六进制的,我的意思是仅由(0-9)和(A-F)大写字母以及破折号(-)组成。。。比如说

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


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

[编辑]

好的,现在您已经澄清了输入

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

下面是将[0-9]、[a-z]+['-']范围内的5个字符打包为整数的新函数。首先需要将十六进制字符串还原为正常状态,然后通过下面的位旋转运行它

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;
}
字符串c//这是要散列的文本。
公共覆盖int GetHashCode()
{
如果(c.Length>5)抛出新的InvalidOperationException(“滑动窗口字符串太长”);
常量字符破折号=(字符)45;
//在整型内将所有字符右对齐打包

return(c[0]-破折号字符串中的字符有什么分布?如果足够少的字符,那么您可以计算五个字符的无损哈希。真的;字符串都是十六进制的,我的意思是仅由(0-9)和(a-F)大写字母以及破折号(-)组成例如,我的字符串可以是AB-2C-65-ED65,你的哈希函数可以帮助滑动窗口,我的意思是从以前的窗口哈希中受益,为了节省更多的时间,请和谢谢aloouu可能甚至不需要考虑进一步优化上面的函数。那些位移位操作符快速运行。谢谢你的代表。是的,但我想通知你,may range是破折号,[0-9]和[A-F]不是[A-z],因此它们是17卡赫而不是37卡塔汉克斯,请回答,但我想通知你,may range是破折号,[0-9]和[A-F]不是[A-z],所以它们是17个字符而不是37个字符,现在我不知道你的答案是否会改变?另外,我是dehex,将每个2个十六进制转换为它们的int值,并将它们视为一个值,破折号可以忽略……你认为……这是一种有效的散列方式还是可以做得更好……请帮助我,并感谢alot dearHi Duaa-哇,这种变化事情太多了!你能把破折号从17位降到16位吗?不管怎样,上面的函数可以正常工作,因为它接受a-Z,其中包括a-F。如果你认为你会添加另一个字符(使其为6位)我将用你使用的17个字符编写函数,最多允许使用6个字符(而不是5个)。否则,函数将非常有效!