根据微软关于 的文档NEWSEQUENTIALID
,NEWSEQUENTIALID 的输出是可以预测的。但是可预测性如何?假设我有一个由 生成的 GUID,NEWSEQUENTIALID
它有多难:
- 计算下一个值?
- 计算前一个值?
- 计算第一个值?
- 计算第一个值,即使根本不知道任何 GUID?
- 计算行数?例如,当使用整数时,
/order?id=842
告诉我应用程序中有 842 个订单。
下面是一些关于我在做什么以及各种权衡是什么的背景信息。
使用 GUID 而非整数作为主键的安全优势之一是 GUID 很难猜测。例如,黑客看到一个/user?id=845
他可能会尝试访问的 URL /user?id=0
,因为数据库中的第一个用户很可能是管理用户。此外,黑客可以迭代/user?id=0..1..2
以快速收集所有用户。
同样,整数的隐私缺点是它们会泄露信息。/order?id=482
告诉我,该网店自实施以来已收到 482 个订单。
不幸的是,使用 GUID 作为主键具有众所周知的性能缺点。为此,SQL Server 引入了该NEWSEQUENTIALID
功能。在这个问题中,我想了解输出的可预测性NEWSEQUENTIALID
。