当前位置: 首页 > 知识库问答 >
问题:

为所有字母表生成相同的唯一哈希代码

端木高邈
2023-03-14

最近,我参加了一次面试,遇到了一个关于哈希碰撞的很好的问题。

问题:给出一个字符串列表,把字谜一起打印出来。

示例:

I/P: 、 、 、 、 、 、 、 、 、 、 、 、 {行为,上帝,动物,狗,猫}

O/P:               演戏,猫,狗,上帝


我要创建hashmap并将单词作为键,将值作为字母表列表

为了避免冲突,我想为字母表生成唯一的哈希代码,而不是排序并使用排序后的单词作为键。

我正在寻找哈希算法,照顾冲突,而不是使用链接。我想要算法为act和CAT生成相同的哈希代码...以便将下一个单词添加到值列表中

有谁能提出一个好的算法吗?

共有1个答案

欧阳俊晖
2023-03-14

使用排序字符串进行散列是非常好的,我可能会这样做,但它确实可能会很慢而且很麻烦。这里有另一个想法,不确定它是否有效-选择一组素数,你喜欢的小,大小和你的字符集一样,并建立一个快速映射函数,从你的字符到它。然后,对于给定的单词,将每个字符映射到匹配的素数中,然后相乘。最后,使用结果进行哈希。

这与Heuster所建议的非常相似,只是有较少的碰撞(实际上,我相信不会有假碰撞,给定任意数的素分解的唯一性)。

简单的例如-

int primes[] = {2, 3, 5, 7, ...} // can be auto generated with a simple code

inline int prime_map(char c) {
    // check c is in legal char set bounds
    return primes[c - first_char];
}

...
char* word = get_next_word();
char* ptr = word;
int key = 1;
while (*ptr != NULL) {
    key *= prime_map(*ptr);
    ptr++;
}
hash[key].add_to_list(word); 

[编辑]

关于唯一性的几个字--任何整数都有一个素数的乘法分解,所以在哈希中给出一个整数键,你实际上可以重建所有可能的字符串,它将哈希到它,只有这些字。只要破译成素数,p1^n1*p2^n2*...并将每个素数转换为匹配的字符。p1的字符将出现n1次,以此类推。你不能得到任何你没有明确使用的新素数,素数意味着你不能通过任何其他素数的乘法得到它。

这带来了另一个可能的改进--如果可以构造字符串,只需要标记填充散列时看到的排列。由于这些排列可以按词典的顺序排列,所以您可以用一个数字来替换每一个。这将节省在哈希中存储实际字符串的空间,但需要更多的计算,因此不一定是一个好的设计选择。不过,这让采访的原始问题变得复杂了:)

 类似资料:
  • 所以我想通过添加随机盐来散列我的密码。网。我为此使用的内置类是RNGCryptoServiceProvider-生成随机盐和Rfc2898DeriveBytes-散列实际密码。 但是当我为相同的passwordString组合调用Rfc2898DeriveBytes的GetBytes()函数时,SaltBytes 在我的测试课上,我有这个函数 测试失败了 但是如果在上面的类PBKDF2实现中,如果

  • 用Java编写的现有系统使用字符串的哈希代码作为负载平衡的路由策略。 现在,我无法修改系统,但需要生成共享相同哈希代码的字符串来测试最坏的情况。 我从命令行提供这些字符串,并希望系统将所有这些字符串路由到同一个目的地。 有可能生成大量共享相同哈希代码的字符串吗? 为了明确这个问题: 备注:任何hashCode值均可接受。对字符串是什么没有限制。但它们应该彼此不同。 编辑:不接受String类的重写

  • 我还将列表一中的和成员的每个哈希代码与列表二中成员的哈希代码进行了比较。而且没有区别。但是如果我比较完整列表的hashcode,就有区别了。我不知道为什么。我很无助。 也许有人能帮我。请提前向我致以最诚挚的问候和感谢。

  • 我有一个应用程序,需要非常快速地比较许多小字符串。幸运的是,我可以保证以下所有字符串: 每个字符串中只有前6个字符被认为是重要的;任何剩余字符的差异都将被忽略 比较不区分大小写 字符串中只允许(英文)字母字符“-”和“'”。 我突然想到,因此可以将每个字符串转换为一个可以直接与其他字符串生成的其他进行比较的,从而将潜在成本高昂的字符串比较转换为单周期整数比较。 然而,我还需要将这些字符串用作哈希表

  • 我试图故意制造碰撞。 所以,我有和对象。我已经覆盖了Country的和方法,以便: india.hash代码()==india2.hash代码() 根据JavaHashMap中的冲突解决方案和文章“让这个国家对象在hashmap中”的一部分,如果key1的结果等于key2上的相同操作,那么应该会有冲突。 所以,我放置断点来查看的内容,并查看它的是2。也就是说,它包含两个不同的条目,并且没有link

  • 现在我正在做 但是有没有更好的方法呢?类似于Scala的