azure - 在 Azure 上使用 SequentialGuidValueGenerator 是否安全?
问题描述
我想SequentialGuidValueGenerator
在我的 Entity Framework Core 模型中用作密钥生成器。我担心在同一台机器上运行的多个进程可能最终会出现键冲突。
此类使用是否安全?
解决方案
是的,SequentialGuidValueGenerator
在多台机器和流程上使用是安全的。
只有一部分Guid
是顺序的(基于SequentialGuidValueGenerator
类第一次初始化然后每次Guid
生成递增时机器的当前时间(以滴答为单位)。
其他部分包含常量(通常是 MAC 地址或类似的东西)和随机值(通常是伪随机生成的)。
GUID背后的整个想法是,它们保证在全球范围内是独一无二的。顺序概念只是一种调整,以一种数据库友好的方式生成它们,从而减少索引碎片。
算法
的源代码使用SequentialGuidValueGenerator
该Guid.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它是一个很好的起点,还列出了主要的背景论文和参考资料。
推荐阅读
- android - 用户禁用通知时的前台服务
- android - 在命令行上开发 Android kotlin 应用程序与 Android Java 应用程序的差异(没有 android studio)
- java - 来自 IBM 的 Watson 助手 API 的 javax.net.ssl.SSLHandshakeException
- node.js - Node.js 不会加载 Let's Encrypt 证书
- android - Android,videoView打不开这个视频在线视频
- sql - sql查询遍历行并进行计算
- reactjs - 在已安装的酶测试中未调用 componentDidUpdate
- android - React-native-router-flux 动态更新 rightButtonImage
- eclipse - 如何在 Eclipse 窗口中创建多个工作空间
- opencv - 如何在 OPENCV 中对手写帐号和排序代码进行数字分割?