我希望在一个数据库表中使用PHP生成的唯一ID,该表很可能永远不会超过10000条记录。我不希望创建时间可见或者使用纯数字值,因此我使用了如下方式:
sha1(uniqid(mt_rand(), true))
使用散列作为唯一标识符是否有问题?所有散列是否都会出现冲突,或者概率如此之小以至于在这种情况下不应考虑?
另外一个问题:如果要被散列的字符数量小于sha1哈希中的字符数量,那么它不总是唯一的吗?
我希望在一个数据库表中使用PHP生成的唯一ID,该表很可能永远不会超过10000条记录。我不希望创建时间可见或者使用纯数字值,因此我使用了如下方式:
sha1(uniqid(mt_rand(), true))
使用散列作为唯一标识符是否有问题?所有散列是否都会出现冲突,或者概率如此之小以至于在这种情况下不应考虑?
另外一个问题:如果要被散列的字符数量小于sha1哈希中的字符数量,那么它不总是唯一的吗?
如果两个相同,那将是多么可怕?墨菲定律适用 - 如果一百万分之一,甚至是十万分之一的机会可以接受,那就去做吧!实际机会要小得多 - 但如果发生这种情况会导致系统崩溃,那么必须先解决设计缺陷,然后自信地继续。
以下是一个关于概率的问题/答案:SHA1碰撞的概率
电脑随机数并非真正的随机,你知道吗?
假设你在Unix环境下,唯一可以获取真正随机数的方式是使用 /dev/random
,但这是一个阻塞操作,取决于用户的交互行为,例如移动鼠标或键盘输入。从 /dev/urandom
读取可能不太安全,但它比仅使用ASCII字符更好,并且可以立即响应。
sha1($ipAddress.time()) 的作用是防止任何人在同一时间使用相同的IP地址。