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

哈希函数提供更少的冲突

申宜
2023-03-14

我正在使用这个散列函数,但是我会遇到很多冲突。目的是添加元素的ascii值并输出该值。有什么方法可以优化这个或另一个功能来减少碰撞的次数?

int hash(char* s)
{
    int hash = 0;
    while(*s)
    {
        hash = hash + *s;
        s++;
    }
    return hash;
}

共有1个答案

龙才俊
2023-03-14

一个32位的int的范围超过40亿。(如果int是64位,则范围要大得多。)但是您的代码只是将字符串中每个字符的值相加,它永远不会接近上限。您的所有哈希代码都将是较小的数字,挤占了可能值的低端,并且增加了冲突的机会。

这就是为什么一个好的算法会比这更复杂的原因。

这里有一篇文章出现在谷歌的快速搜索中。

 类似资料:
  • 这里是我需要完成的,但是我刚开始哈希&甚至不知道从哪里开始。有人能帮帮我吗? 对由5个字符(A-Z和A-Z中的字符)组成的文本词设计一个名为Bailando的哈希函数。 提供一个算法(一组操作)来生成哈希函数的输出。尝试提出一个看起来没有冲突的哈希设计。 什么是基于您的设计的Bailando(“hello”)、Bailando(“three”)和Bailando(“olleh”)。 是否可以在哈希

  • 问题内容: 我正在阅读Java 1.6 API提供的HashMap类的代码,无法完全理解以下操作的需要(位于put和get方法的主体中): 该方法具有以下主体: 通过对提供的哈希码执行位操作,可以有效地重新计算哈希。即使API声明如下,我也无法理解这样做的必要性: 这很关键,因为HashMap使用2的幂的哈希表,否则哈希表在低位无差异时会遇到冲突。 我确实知道键值参数存储在数据结构数组中,并且该数

  • 问题内容: 我需要一个可逆的哈希函数(显然,输入的大小将比输出小得多),该函数将输入以随机的方式映射到输出。基本上,我想要一种将“ 123”之类的数字转换为“ 9874362483910978”之类的较大数字的方法,但不是要保留比较的方法,因此,如果x1> x2,f(x1 )> f(x2)(但也不能始终为假)。 这种情况的用例是,我需要找到一种方法将小数字转换成看起来更大的随机数字。它们实际上并不

  • 我正在尝试编写一个C程序,使用哈希表来存储不同的单词,我需要一些帮助。 首先,我创建一个哈希表,其大小为最接近我必须存储的单词数的素数,然后我使用一个哈希函数为每个单词找到一个地址。我从最简单的函数开始,把字母加在一起,结果有88%的碰撞。然后我开始实验这个函数,发现无论我把它改成什么,碰撞都不会低于35%。现在我在用 这只是我想出来的一个随机函数,但它给了我最好的结果--大约35%的碰撞。 在过

  • 问题内容: 在Java 8 java.util.Hashmap中,我注意到来自的更改: 至: 从代码中可以看出,新功能是低16位的简单形式,而高16位则保持了高16位不变,这与先前实现中的几种不同移位相反,并且从注释中可以看出,这在分配上不太有效散列函数的结果,其中低位对不同的存储区具有大量冲突,但由于必须执行较少的操作,因此节省了CPU周期。 我在发行说明中唯一看到的是从链接列表到平衡树的更改,

  • 问题内容: HashMap中的Hash Collision或Hashing Collision并不是一个新话题,我遇到了多个博客和讨论区,解释了如何产生Hash Collision或如何以模棱两可和详细的方式避免它。我最近在一次采访中遇到了这个问题。我有很多事情要解释,但我认为准确地给出正确的解释真的很困难。抱歉,如果我在这里重复我的问题,请给我准确的答案: 哈希冲突到底是什么?它是一项功能或常见