首页 > 解决方案 > 在 Azure 上使用 SequentialGuidValueGenerator 是否安全?

问题描述

我想SequentialGuidValueGenerator在我的 Entity Framework Core 模型中用作密钥生成器。我担心在同一台机器上运行的多个进程可能最终会出现键冲突。

此类使用是否安全?

标签: azureentity-framework-core

解决方案


是的,SequentialGuidValueGenerator在多台机器和流程上使用是安全的。

只有一部分Guid是顺序的(基于SequentialGuidValueGenerator类第一次初始化然后每次Guid生成递增时机器的当前时间(以滴答为单位)。

其他部分包含常量(通常是 MAC 地址或类似的东西)和随机值(通常是伪随机生成的)。

GUID背后的整个想法是,它们保证在全球范围内是独一无二。顺序概念只是一种调整,以一种数据库友好的方式生成它们,从而减少索引碎片。

算法

源代码使用SequentialGuidValueGeneratorGuid.New()方法作为其顺序算法的基础:

视窗:

在 Windows 上,Guid.New()使用CoCreateGuid 函数

CoCreateGuid 函数调用 RPC 函数 UuidCreate,它创建一个 GUID,一个全局唯一的 128 位整数。当您需要一个绝对唯一的数字时,请使用 CoCreateGuid,您将在分布式环境中将其用作持久标识符。在非常高的确定性中,此函数返回一个唯一值——在同一或任何其他系统(网络连接)上没有其他调用与否),应该返回相同的值。

该函数使用UuidCreate 函数

出于安全原因,通常希望防止网络上的以太网地址在公司或组织之外可用。UuidCreate 函数生成的 UUID 无法追溯到生成它的计算机的以太网地址。它也不能与在同一台计算机上创建的其他 UUID 关联。如果您不需要此级别的安全性,您的应用程序可以使用 UuidCreateSequential 函数,该函数的行为与所有其他操作系统版本上的 UuidCreate 函数完全相同。

Unix:

在 Unix 上,Guid.New()只使用随机字节。

SequentialGuidValueGenerator

使用检索到的 normal ,每次调用都会根据创建类时的 UTC 时间(参见源代码Guid)递增计数器(参见源代码)。SequentialGuidValueGenerator

Guid然后用计数器更新索引相关的部分(参见源代码);

更多的信息

我们最近在 GitHub 上的问题Check that SequentialGuidValueGenerator 仍然匹配 SQL Server 行为 #19124中审查了算法,因为我在确保生成的 GUID 符合 RFC 4122 标准中提出了潜在问题(与您的问题无关;与索引性能有关). 第969

对于 GUID 及其不同格式的一般信息,维基百科文章Universally unique identifier它是一个很好的起点,还列出了主要的背景论文和参考资料。


推荐阅读