基本上,我正在尝试创建一个独特对象的对象,一组.我有一个很好的想法,就是只使用带有对象的JavaScript对象作为属性名称.如,
set[obj] = true;
Run Code Online (Sandbox Code Playgroud)
这很有效.它适用于字符串和数字,但对于其他对象,它们似乎都"散列"到相同的值并访问相同的属性.是否有某种方法可以为对象生成唯一的哈希值?字符串和数字如何做,我可以覆盖相同的行为吗?
我正在使用C语言编写哈希表,我正在测试字符串的哈希函数.
我尝试过的第一个函数是添加ascii代码并使用modulo(%100)但是我在第一次数据测试时得到的结果很差:140个单词的40个冲突.
最终的输入数据将包含8 000个单词(它是一个文件中的dictionnary存储).哈希表声明为int table [10000]并包含txt文件中单词的位置.
第一个问题是哪个是散列字符串的最佳算法?以及如何确定哈希表的大小?
提前致谢 !
:-)
该djb2算法对字符串的哈希函数.
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
Run Code Online (Sandbox Code Playgroud)
为什么5381和33如此重要?
我正在研究HashMapJava 中的实现,并且一度陷入困境.功能
是如何indexFor计算的?
static int indexFor(int h, int length) {
return h & (length-1);
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我发现VS2005上的标准哈希函数在尝试实现高性能查找时非常缓慢.有哪些快速有效的哈希算法可以解决大多数冲突的好例子?
我有很多英文单词,我想哈希.什么是良好的散列函数?到目前为止,我的散列函数将字母的ASCII值相加,然后以表格大小为模.我正在寻找一些有效而简单的东西.
问题
对于用户定义类型的std :: unordered_map或std :: unordered_set的第三个模板参数,std :: hash有什么好的特殊性,所有成员数据类型都已经具有良好的std :: hash特性?
对于这个问题,我将"好"定义为易于实现和理解,合理有效,并且不太可能产生哈希表冲突.商品的定义不包括任何有关安全性的陈述.
什么是谷歌的状态
目前,两个StackOverflow问题是Google搜索"std hash specialization"的第一个问题.
第一个,如何在无序容器中为用户定义的类型专门化std :: hash :: operator()?,解决了打开std命名空间和添加模板特化是否合法的问题.
第二个,如何专门化来自其他库的类型的std :: hash,基本上解决了同样的问题.
这留下了当前的问题.鉴于C++标准库的实现为标准库中的基本类型和类型定义了散列函数,为用户定义的类型专门化std :: hash的简单有效方法是什么?有没有一种很好的方法来组合标准库实现提供的哈希函数?
(编辑感谢dyp.)StackOverflow的另一个问题是如何组合一对哈希函数.
谷歌的其他结果没有任何帮助.
这篇 Dobbs博士的文章指出,两个令人满意的哈希的XOR将产生一个新的令人满意的哈希值.
这篇文章似乎是从知识中说出并暗示了很多东西,但却注重细节.它与第一个例子中的简短评论中的Dr. Dobbs文章相矛盾,称使用XOR组合散列函数会产生一个弱的结果散列函数.
因为XOR应用于任何两个相等的值导致0,我可以看出为什么XOR本身很弱.
元问题
一个很好的理由回答解释为什么这个问题无效且一般无法回答也是受欢迎的.
为简单起见,我的问题是:如何尽快散列字符串(大约200个字符).安全性并不重要,但碰撞是一件大事.
注意:经过快速调查,似乎MurmurHash3可能是最好的选择.我愿意接受任何评论,否则说'
首先,我知道还有很多其他类似的问题,但我还没有找到令人信服的答案.
我有一个对象列表,每个对象包含一个大约3k段的列表,保存到数据库中.每隔X个小时,这些段落都会被重新生成,我需要查找是否有任何段落发生了变化,如果是,则只推送那些新段落.
我发现找到差异的最快方式(知道大部分内容都是相同的)是创建MerkleTree,将其保存到数据库中,并迭代MerkleTree以找出差异,而不是比较段落本身.
在我的情况下,这意味着我将每秒创建数万个哈希值,以与数据库中的内容进行比较.因此,我需要一种非常有效的方法来创建这些哈希.我不关心安全性,我只需要确保碰撞的数量仍然非常低.
Java中可用的最佳算法是什么?
在我的例子中,主要对象由Sections组成,Sections由Languages组成,由Paragraph组成.比较策略是:
1)如果对象哈希相同,则停止,否则转到2)
2)循环所有Section,只保留带有不同散列的Section
3)循环这些部分的所有语言,只保留具有不同散列的语言
4)循环所有这些语言的所有段落,如果哈希值不同,则推送新内容.
如何将非数字字符串转换为整数?
我得到了例如:
String unique = "FUBAR";
将字符串表示为没有冲突的整数的好方法是什么,例如"FUBAR"应始终表示为相同的数字,并且不应与任何其他字符串冲突.例如,String a = "A";应该表示为Integer 1等等,但是执行此操作的方法是什么(最好是对所有unicode字符串,但在我的情况下,ASCII值可能就足够了).
hash ×6
c++ ×3
java ×3
c ×2
algorithm ×1
c++11 ×1
dictionary ×1
hashcode ×1
hashmap ×1
hashtable ×1
int ×1
javascript ×1
merkle-tree ×1
performance ×1
set ×1
stl ×1
string ×1
windows ×1