【发布时间】:2021-04-05 14:28:40
【问题描述】:
我正在寻找一种方法来生成唯一字符串作为我的数据库的主键。我知道 GUID 的冲突概率非常低,但我想知道是否可以使用它来获得 100% 唯一的密钥(99.99 唯一性是不够的;)
我正在使用 ASP.NET Core v5、Entity Framework Core v5.0.1、SQL Server。
请注意,我想要不可猜测的 ID-s(identity(1,1) 目前不是我的解决方案)
【问题讨论】:
-
在单个表中唯一?添加一个唯一的约束,如果发生碰撞,则循环,它不会 - 工作完成。世界独一无二?没有。
-
GUID 就足够了。别担心。
-
保证唯一性和不可猜测性是两个完全不同的东西。独特意味着不等于其他任何东西。 Un-guess-able 当然不可能,但是让最难猜测的东西的方法是让它加密随机,根据定义,它永远不会是 100% 唯一的(但你可以很很容易使可能性低于行星爆炸的可能性,这实际上对你来说可能已经足够好了,即使你不这么认为)。
-
@DorinBaba 是的,我告诉你,你必须选择其中一个。使其 100% 保证始终唯一的方法是使用可以确定不会重复的可预测模式。使某些事情尽可能难以猜测的方法是使用加密强度随机数生成器,这在技术上永远不可能重复,只是一种任意低的可能性。除非您有一个实体负责通过与所有其他现有值进行比较来验证唯一性(即对充满密码随机数据的列的唯一约束。
-
@xanatos 你没有理解。如果我想猜测序列中某个项目的值,或者要创建的下一个值,我只需从 0 开始计数,生成 N 的值,自己对值进行散列,生成 N2,并且知道我知道那个值我不应该猜到,也不需要尝试所有选项。
标签: c# sql-server entity-framework primary-key guid