【发布时间】:2013-04-27 11:03:58
【问题描述】:
我想在可能永远不会超过 10,000 条记录的数据库表中使用 PHP 生成的唯一 ID。我不希望创建时间可见或使用纯数值,所以我正在使用:
sha1(uniqid(mt_rand(), true))
对唯一 ID 使用哈希是错误的吗?不是所有的哈希都会导致冲突吗?或者在这种情况下不应该考虑这些可能性?
还有一点:如果要散列的字符数小于 sha1 散列中的字符数,它不总是唯一的吗?
【问题讨论】:
-
不,没有错。使用将时间戳传递给 sha1 会很好。
-
这可能是个好读物:: stackoverflow.com/questions/2768191/…
-
为什么要创建自己的唯一 ID?你的数据库不支持自增主键吗?这通常被认为是在数据库标识符上拥有唯一 ID 的方式。
-
@Patrick M 我不希望这些 ID 有任何意义。
-
这样做的一个原因是为了防止黑客在您的应用程序中找到一个 http GET 端点,并简单地使用这些顺序自动递增的键来浏览您的数据库。几年前发生在 AT&T 上的事情相当有名,抱歉,找不到它的链接,但我每次设计系统时都会记得它。因此,将端点 /customer/5 转换为 /customer/dhftrt5sahjgertgjwygad 是一个明显的优势 - 否则会真的如此简单地被黑客入侵。