如何在C中编写哈希函数?

时间:2010-02-10 15:43:45

标签: c hashtable hash hash-function

哈希表被认为是存储/检索数据的最快/最佳方式。

我对哈希表的理解,哈希如下(如果我错了请纠正我或者请添加如果还有更多):

  • 哈希表只是一个存储值的数组(单维或多维)。
  • 哈希是在数组中查找索引/位置以插入/检索数据的过程。您获取一个数据项并将其作为键传递给哈希函数,您将获得索引/位置插入/检索数据的位置。

我有一个问题:

哈希函数是否用于存储/检索来自a的数据不同 加密哈希函数在安全应用程序中用于身份验证 像MD5,HMAC,SHA-1等...?

他们以什么方式不同?

  • 如何在C中编写哈希函数?
  • 是否有一些标准或指导方针?
  • 我们如何确保散列函数的输出,即索引不在范围之外?

如果你能提一些好的链接来更好地理解这些,那就太好了。

3 个答案:

答案 0 :(得分:11)

加密哈希强调让任何人都难以有意创建冲突。对于哈希表,重点通常是产生合理的结果分布快速。因此,这两者通常是完全不同的(特别是,加密哈希通常是 lot 更慢)。

对于典型的散列函数,结果仅受类型的限制 - 例如如果它返回size_t,那么返回任何可能的size_t就完全没问题了。您可以将输出范围缩小到表格的大小(例如,使用除以表格大小的剩余部分,通常应该是素数)。

例如,一个相当典型的普通哈希函数可能类似于:

// warning: untested code.
size_t hash(char const *input) { 

    const int ret_size = 32;
    size_t ret = 0x555555;
    const int per_char = 7;

    while (*input) { 
        ret ^= *input++;
        ret = ((ret << per_char) | (ret >> (ret_size - per_char));
   }
   return ret;
}

这里的基本思想是让输入字符串的每一位都影响结果,并且(尽可能快地)使结果的每一位都受到至少部分输入的影响。请注意,我并不是特别推荐这个作为一个很好的哈希函数 - 只是试图说明你想要完成的一些基础知识。

答案 1 :(得分:4)

鲍勃·詹金斯(Bob Jenkins)写了一篇关于他的好的深度描述,如果有点过时,hash function。这篇文章提供了更新,更好的哈希函数的链接,但是这篇文章解决了构建一个好的哈希函数的问题。

此外,大多数哈希表实现实际上使用链接列表数组来解决冲突。如果您只想使用数组,则哈希函数需要检查冲突并创建新的哈希索引。

您提到的加密哈希函数可以用作哈希表的哈希函数, 但是它们比为散列表设计的散列函数要慢得多。速度使蛮力攻击更容易。

答案 2 :(得分:0)

设计目标不同。

例如,使用cryptographic hash functions,哈希和散列函数不能用于确定原始数据或任何其他会产生相同散列的数据。

散列表使用的散列函数&amp;其他数据结构不需要这样的安全属性。如果哈希函数很快并且它会将输入集均匀地分配到可能的哈希集中(以避免不必要的聚类/冲突),这通常就足够了。