当前位置: 首页 > 面试题库 >

NEWSEQUENTIALID的可预测性如何?

贲永思
2023-03-14
问题内容

根据Microsoft在上的文档NEWSEQUENTIALID,NEWSEQUENTIALID的输出是可预测的。但是可预测性如何呢?假设我有一个GUID,该GUID是由生成的NEWSEQUENTIALID,要执行以下操作会有多困难:

  • 计算下一个值?
  • 计算先前的值?
  • 计算第一个值?
  • 即使根本不知道任何GUID,也要计算第一个值?
  • 计算行数?例如,当使用整数时,/order?id=842告诉我应用程序中有842个订单。

以下是有关我在做什么以及各种折衷方法的一些背景信息。

使用GUID的整数而不是整数作为主键的 安全
好处之一是,GUID很难猜测。例如说,黑客看到的URL就像/user?id=845他可能尝试访问的URL
/user?id=0,因为数据库中的第一个用户很可能是管理用户。此外,黑客可以迭代/user?id=0..1..2以快速收集所有用户。

同样,整数的 隐私 缺点是它们会泄漏信息。/order?id=482告诉我,网上商店自实施以来已有482个订单。

不幸的是,使用GUID作为主键具有众所周知的 性能 缺点。为此,SQL
Server引入了该NEWSEQUENTIALID功能。在这个问题中,我想学习输出的可预测性NEWSEQUENTIALID


问题答案:

底层OS功能是UuidCreateSequential。该值是从您的网卡MAC地址之一和per-
os-boot增量值得出的
。参见RFC4122。SQL
Server进行一些字节转换以使结果正确排序。因此,从某种意义上说,该值是高度可预测的。具体来说,如果您知道一个值,则可以立即预测相似值的范围。

但是,您无法预测的等价物id=0,也无法预测这52DE358F-45F1-E311-93EA-00269E58F20D意味着该商店至少出售了482件商品。

唯一“批准的”随机生成是CRYPT_GEN_RANDOM(自动换行CryptGenRandom),但这显然是一个可怕的关键候选人。



 类似资料:
  • 问题内容: 我知道双重价值的内部代表是这样的。但是下面的代码仍然让我感到困惑。 码: 输出: 到底是怎么回事?加法,乘法进行得很好,但减法,除法则不好。谁能解释一下 加法为何与减法不同 ? 问题答案: 简短的答案是,对于浮点运算,您存在表示错误和舍入错误。在“知道”表示错误,所以如果没有舍入误差,你看不到它。但是,如果舍入误差太大,则可以。 解决方案是使用BigDecimal或舍入结果。 如果使用

  • 我正在读一本关于计算机体系结构的书,我在这一章讨论分支预测。有一个小练习,我很难把我的头缠绕在它周围。 考虑以下内部for循环 ------>内循环: b)1位分支预测缓冲器会改善性能吗(与a相比)?假设第一个预测是“未采取”,并且没有其他分支映射到该条目。 ----假设第一个预测是“不采取”,如果预测错误,则1位预测器反转该位。所以它将是NT/T/T。这是否使它具有与问题a)相同的性能?有1个未

  • 问题 你需要生成在一定范围内的随机数,但你也需要对发生器进行“生成种子”操作来提供可预测的值。 解决方案 编写你自己的随机数生成器。当然有很多方法可以做到这一点,这里给出一个简单的示例。 该发生器绝对不可以以加密为目的! class Rand # 如果没有种子创建,使用当前时间作为种子 constructor: (@seed) -> # Knuth and Lewis' impro

  • 问题内容: 我想编写一个存储后端来存储更大的数据块。数据可以是任何东西,但主要是二进制文件(图像,pdf,jar文件)或文本文件(xml,jsp,js,html,java …)。我发现大多数数据已经被压缩。如果所有内容都经过压缩,则可以节省大约15%的磁盘空间。 我正在寻找最高效的算法,该算法可以高概率地预测可以压缩或不压缩(无损压缩)大块数据(假设无损压缩),而不必尽可能查看所有数据。 压缩算法

  • 我正在编写一些音频代码,其中基本上所有内容都是一个小循环。据我所知,分支预测失败是一个足够大的性能问题,我很难保持代码分支的自由。但是只有这么远的时间才能带我,这让我想知道不同类型的分支。 在 c 中,固定目标的条件分支: 并且(如果我正确理解这个问题),无条件分支到变量目标: 是否存在性能差异?在我看来,如果这两种方法中的一种明显快于另一种,编译器只需将代码转换为匹配即可。 对于那些分支预测非常

  • 有2个基准运行显示了意外的性能偏差。 运行1 运行2 null 解决方案:根据apangin的建议,禁用分层编译使JIT结果稳定。