具有长输出长度的PHP哈希函数?

时间:2008-11-17 12:56:01

标签: php hash

在我的代码中,我正在生成URL的哈希值(实际上是无限长度)。我目前正在使用sha1(),我知道它很有可能发生冲突,但是我有多达255个字节来存储哈希,所以我觉得我可以利用那个可用空间来降低碰撞的几率进一步

是否有:

  1. 另一个具有更长或可自定义哈希长度的PHP哈希函数?
  2. 使用固定长度哈希函数(如sha1)和可变长度输入来生成更长哈希的方法吗?
  3. 或者,sha1的20字节哈希是否适合任何事情,我应该不再担心它了?

7 个答案:

答案 0 :(得分:5)

  

或者,sha1的20字节对任何事情都有好处,我应该不再担心它了吗?

完全。

Hashtables,Pigeonholes和生日
http://www.codinghorror.com/blog/archives/001014.html

答案 1 :(得分:3)

让我们看看...... http://www.cryptography.com/cnews/hash.html

  问:发现有多难   SHA-1中的碰撞?
  答:据报道   攻击需要估计的工作   因子为2 ^ 69(约为590   亿亿次哈希计算

看起来风险很低...... ^ _ ^

答案 2 :(得分:1)

如果您真的很担心,请选择256位或512位哈希值(32或64个字符)。

如果你真的,非常偏执,加盐。

如果你比这更偏执,可以将两个哈希值连接成更长的哈希值,例如md5和sha-256。

答案 3 :(得分:0)

您可以随时在现有哈希中添加/附加顺序ID(十进制或十六进制)吗?

当然你不会有一个固定长度的哈希,但你知道代码是a)唯一的和b)不可猜测的(即使有人注意到顺序部分他们不知道你正在腌制/散列的方式其余的代码。)

当然,如果您不想隐藏任何人的这些哈希值,那么为什么不首先简单地使用顺序ID呢?

答案 4 :(得分:0)

由于我不确切地知道你要做什么,我会假设你不想输入两次数据而你想要快速检测碰撞的能力。在那种情况下,我提出了伪代码中的以下算法:

found = false
hv = hash(urlValue)
if table[hash,url] contains pair (hv,urlValue)
   found = true
endif

if (not found)
   insert table (hv,urlValue)
endif

在您的数据库中,在哈希列上创建一个非唯一索引以加快查找速度。这将允许查询(hash,url)快速进行 - 在正常情况下,您只查看一行,因为哈希可能是唯一的,但您实际上决定接受或拒绝基于实际的URL。这将允许您使用更短的哈希函数。据推测,您已经存储了该URL以供以后使用,因此这不会涉及任何额外的存储空间。

答案 5 :(得分:0)

如果你真的对它感到疯狂,你可以做的就是结合网址不同部分的哈希值。

假设URL长度为40个字符 - 将其分为5个部分:获取字符1-8的SHA1,连接到字符9-16的SHA1,连接到17-24的SHA1 ......等等。理论上那么你将有2个 800 的可能性,只需要在2 (69 * 5) = 2 345 =之后开始担心碰撞7.2 * 10 103 行。

但就像我说的那样,我们正用这样的方法直奔疯狂城镇。

答案 6 :(得分:0)

嗯,只有你有ashort哈希键才有意义。否则表中存在数据溢出的风险。