什么是一个很好的散列函数?我看到了一个很大的散列函数和应用程序在我的数据结构的课程,在大学,但我主要有,很难使一个良好的散列函数。作为一个规则,以避免碰撞我的教授说:

function Hash(key)
  return key mod PrimeNumber
end

(国防部是该%操作员在C和相似的语言)

与总理数量的大小的散列表。我得到这是一个有良好功能,以避免冲突和快速的一个,但我怎么可以做一个更好的?是否有更好的散列函数为串钥匙对数字的钥匙?

有帮助吗?

解决方案

这样做的"正常"哈希查表,基本上任何种类的数据-这一由保罗*谢是最好的,我用过。

http://www.azillionmonkeys.com/qed/hash.html

如果你关心过加密的安全或任何其他更先进,然后情况因人而异。如果你只是想踢屁股的一般目的散列函数为哈希查表,那么这就是你要找的是什么。

其他提示

有没有这样的东西作为一个"好的散列函数"普遍哈希(ed.是的,我知道有这样的事"普遍散列"但那不是我的意思).根据上下文不同的标准确定质量的散列。两个人已经提到沙。这是一个加密散列并不是在所有良好的散列的表格你可能意味。

哈希表已经非常不同的要求。但是,找到一个很好的散列函数普遍是困难的,因为不同的数据类型,获得不同的信息,可以进行散列.作为一项规则的经验是很好的考虑 所有 信息类型保持一样。这并不总是容易或者甚至是可能的。原因的统计数据(和因此碰撞),它也是重要的,产生了良好的传播的问题的空间,即所有可能的对象。这意味着当的散列数字之间的100和1050它没有好到让最显着的位玩一个很大的一部分,在哈希因为-90%的对象,这个数字将为0。这是更为重要的是我们的最后三位数字确定的散列。

同样,在哈希串重要的是要考虑所有的角色–除非它是预先知道,第一三个字符的所有串将是相同的;考虑到这些然后是废弃物。

这实际上是一个情况,我建议读什么Knuth有说 艺术的计算机编程, ,第一卷。3.另一个很好的阅读是切丝*沃克 艺术的散列.

有两个主要目的散列功能:

  • 以分散的数据点均匀入n位。
  • 安全地识别数据的输入。

这是不可能的建议一散列不知道你是什么使用它的。

如果你只是使得哈希表在一个程序,然后你不需要担心如何可逆或可删节的算法是...沙-1或AES是完全不必要的为了这个,你会更好的使用 变化的FNV.FNV实现更好的分散性(并因此减少碰撞)不是一个简单的理mod喜欢你所提到的,它更能适应变输入的大小。

如果你使用哈希隐藏和认证公众信息(例如散列一个密码或一个文件),则应使用的一个主要的散列算法审查通过公共审查。 散列函数的休息室 是一个良好的开端。

这是一个例子的一个良好的之一,也是一个例子,为什么你从来不想写一个。这是一个Fowler/Noll/Vo(FNV)的散列其是相等的部分计算机科学的天才和纯粹的巫毒:

unsigned fnv_hash_1a_32 ( void *key, int len ) {
    unsigned char *p = key;
    unsigned h = 0x811c9dc5;
    int i;

    for ( i = 0; i < len; i++ )
      h = ( h ^ p[i] ) * 0x01000193;

   return h;
}

unsigned long long fnv_hash_1a_64 ( void *key, int len ) {
    unsigned char *p = key;
    unsigned long long h = 0xcbf29ce484222325ULL;
    int i;

    for ( i = 0; i < len; i++ )
      h = ( h ^ p[i] ) * 0x100000001b3ULL;

   return h;
}

编辑:

  • 兰登科特诺尔建议关 他的站点 该FVN-1A算法的原FVN-1的算法:改进的算法更好地分散的最后一个字节的散列。我调整的算法。

我想说的是,主要的原则是,不要滚你自己的。尝试使用的东西已经彻底的测试,例如,沙-1或沿着这些线路的东西。

一个很好的散列函数具有以下性能:

  1. 鉴散列的一个消息是计算上不可行的攻击者找到另一个消息使他们的散列值是相同的。

  2. 给予一个对信息、m'm,这是计算上不可行的,以找到两个这样的,h(m)=h(m')

这两种情况都是 相同。在第一种情况下,有一个预先存在的哈,你在试图找到一个碰撞。在第二种情况下,你们试图找到 任何 两个邮件发生碰撞。第二项任务是明显更加容易因生日"悖论"。

在那里的表现不是那个伟大的问题,应始终使用安全的散列函数。有的是非常聪明的攻击,可以执行通过迫使冲突中的散列。如果使用强大的东西从一开始,你就会安全的自己对这些。

不用MD5或SHA-1中的新设计。最密码学家,包括我在内,将考虑他们的破碎。该原则的来源的弱点在这两者设计的是,第二酒店,这是我上面所概述的,不持有为这些结构。如果攻击者可以产生两个消息,和m',这两个散列值相同,他们可以使用这些消息对你。沙-1和MD5也遭受消息的扩展攻击,这可能致命地削弱你的应用程序,如果你不小心。

一个更现代的散列如漩涡是一个更好的选择。它不会遭受这些消息的扩展攻击和使用相同的数学作为AES用来证明对安全的各种攻击。

希望这可以帮助!

什么你是说这里是你想拥有一个使用具有冲撞性。尝试使用SHA-2。或试图使用(良好)分组密码在一方式压缩功能(从来没有尝试过之前),像AES在Miyaguchi-Preenel模式。问题是,你需要:

1)有一个四。尽量使用第256位小数部分的数量或类似的东西。2)有一个填充方案。容易的。Barrow它从一个哈喜欢MD5或SHA-3(Keccak[明显'ket泽']).如果你不关心的安全(其他几个人说这种)看FNV或lookup2由鲍勃*詹金斯(实际上是我的第一个reccomends lookup2)也试MurmurHash,它的快速(检查:.16《卡塔赫纳生物技术安全议定书).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top