在我的代码中,我正在生成URL的哈希值(实际上是无限长度)。我目前正在使用sha1(),我知道它很有可能发生冲突,但是我有多达255个字节来存储哈希,所以我觉得我可以利用那个可用空间来降低碰撞的几率进一步
是否有:
或者,sha1的20字节哈希是否适合任何事情,我应该不再担心它了?
答案 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哈希键才有意义。否则表中存在数据溢出的风险。