【发布时间】:2016-11-03 11:30:27
【问题描述】:
我想创建唯一 ID,例如 dujUSJue9389sjgjik。
我使用了 Doctrine 的 UUID 策略来创建它们,但结果类似于 d9c363ae-a1b7-11e6-a66d-9e9923e30d94:我不喜欢使用破折号,而且我想要更短的 ID。
他们必须识别一些实体来构建像http://example.com/entity/hduicw43tv43bic 这样的 URL。
使用 PHP 的 uniqid() 并不能保证生成值的唯一性。我认为冲突非常罕见,但无论如何,根本不排除它,所以我不认为它是“安全的”(冲突可能会导致异常,并且行的创建可能会导致很多令人头疼的问题)。
所以,使用 Doctrine 和 Symfony,我正在寻找一种方法来生成像 ajybUYBD74883bj8d74NJ 这样的值并检查它的唯一性。如果它已经存在,则必须生成一个新值。一旦实体具有唯一值,它就可以被持久化。生成应该在实体创建时发生。
关于如何实现这一点的任何想法?
【问题讨论】:
-
没有真正的唯一值生成算法可以保证唯一性,包括 UUID/GUID。
-
是的,我知道这一点。为此,我正在寻找一个程序来检查唯一性并在失败时(生成的 ID 已经存在)重新生成它。这应该在 Doctrine 实体本身中完成。
-
这应该在实体本身中完成。检查其他实体(包括调用存储库)不是实体的工作。这应该是 ID 生成器的工作。您可以尝试创建自定义 ID 生成器,但我找不到有关它的文档。无论如何,这是 psylosss 回答中的一个例子:stackoverflow.com/questions/15039665/…
-
UUID 只是一个数字。您可以将其显示为插入连字符的十六进制文本,但它仍然是 128 位值。你可以随心所欲地表示它(例如:base64-encoded)
-
@Federkun,是的,当然可以,但我不希望它太长......也许 UUID 具有技术意义,但我只是打算将其作为唯一值来识别一个实体,不受长度、格式或其他任何限制。就这个问题而言,它的独特属性是它的独特性。
标签: php mysql symfony doctrine-orm doctrine