我想在数据库表中使用PHP生成的唯一ID,该表可能永远不会超过10,000条记录.我不希望创建时间可见或使用纯数值,所以我使用:
sha1(uniqid(mt_rand(), true))
Run Code Online (Sandbox Code Playgroud)
使用哈希作为唯一ID是错误的吗?不是所有的哈希都会导致碰撞,或者是否有机会如此遥远以至于在这种情况下不应该考虑它们?
还有一点:如果要散列的字符数小于sha1散列中的字符数,它是否总是唯一的?
如果你有2个密钥,你将有一个理论上最好的情况,即1 ^ 2 ^ X的碰撞概率,其中X是你的散列算法中的位数.最好的情况是因为输入通常是ASCII,它不使用完整的字符集,加上散列函数不能完美分配,所以它们会比现实生活中的理论最大值更频繁地发生碰撞.
回答你的最后一个问题:
还有一点:如果要散列的字符数小于sha1散列中的字符数,它是否总是唯一的?
是的,这是真的.但是你会遇到另一个生成该大小的唯一键的问题.最简单的方法通常是校验和,所以只需选择一个足够大的摘要,碰撞空间就足够小,以保证您的舒适度.
正如@wayne所建议的,一种非常常用的方法是连接microtime()你的随机盐(并base64_encode提高熵).
| 归档时间: |
|
| 查看次数: |
8405 次 |
| 最近记录: |