【问题标题】:Getting appropriate hash index C++获取适当的哈希索引 C++
【发布时间】:2009-10-01 06:14:17
【问题描述】:

我什么都试过了。就连java的论坛啦:

java.lang.String.hashCode():

s[0]*(31^(n-1)) + s[1]*(31^(n-2)) + ... + s[n-1]

我将其解释为总和: 虽然我不太确定如何处理 s[n-1];

int hashmap::hashstr( const char*const str )
{
    int result = 0;
    int i = 0;
    int j = 0;
    int k = 0;
    unsigned n = 0;
    for ( ; str[n] != NULL; ++n ); // how many characters?

    while ( j != n ) // no more characters
    {
        result += str[i] * ( 31 ^ ( n - k ) );
        j++;
        i++;
        k++;
    }
    return result % maxSize;
}

其中 maxSize 是我的固定数组大小 11 中的第 10 个元素。

我做错了什么?我的一些哈希指数出现了错误。其他的,正确的。为什么是这样?到目前为止,每个人都喜欢,“谁在乎它是如何工作的!使用模板!”好吧,我想明白这一点..

【问题讨论】:

  • 我认为在尝试 hashmap 之前你需要学习一些更基本的东西,比如使用 strlen()。
  • 您能解释一下您说索引是“错误”还是“正确”?任何散列函数都有效,但有些效率低下。没有“错误”或“正确”之分。您是否将您的实现与 Java 进行比较?

标签: c++


【解决方案1】:
s[0](31^(n-1)) + s[1](31^(n-2)) + ... + s[n-1]

在公式中^ 表示取幂,而不是按位运算xor
查看this SO 问题。

【讨论】:

    【解决方案2】:
    unsigned n = 0;
    for ( ; str[n] != NULL; ++n ); // how many characters?
    

    你知道你可以使用strlen(str),对吧?

    还有一行:

    return result % maxSize;
    

    这个result 来自哪里?我没有看到任何 result 变量。

    【讨论】:

    • 有人告诉我,在循环中使用 strlen(str) 是不好的枚举数编程实践。
    • @lampshade,你在说什么?你不要把 strlen() 放在一个循环中。您最初找到字符串的大小,它与您的循环无关。
    • 在实际遍历字符串的地方使用 strlen() 是一种不好的做法,因为 strlen() 函数本身首先会遍历字符串一次。也许在这种情况下它并不那么重要,但在任何你实际遍历字符串的代码中,通常更好的做法是用 '\0' 测试当前字符以找出你是否在最后。这有点像使用 ASCIIZ 处理字符串的经验法则。
    • @progician 是的,我只是在解决手动长度计算问题。无论如何,我已经在另一个答案中建议了您上面所说的内容。
    【解决方案3】:

    从这段代码开始,您可以执行以下操作:

    void function (const char *str)
    {
        while (*str)
        {
            /* process whatever with *str which is the same as str[i] in a for loop */
            str++;
        }
    }
    

    此外,您不需要在那些 const char *const 参数上使用第二个 const。 const char * 很好。

    【讨论】:

      猜你喜欢
      • 2019-03-27
      • 2018-08-29
      • 2014-05-18
      • 2013-01-02
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      相关资源
      最近更新 更多