手动更改 GUID - 这有多糟糕?

2024-04-18

手动更改生成的 GUID 并使用它有多糟糕?碰撞的可能性是否仍然微不足道,或者使用 GUID 进行操作是否危险?

有时我们只是更改之前生成的 GUID 的某些字母并使用它。我们应该停止这样做吗?


注意:这个答案错过了一些旧的格式,并且在不久的将来也错过了新的变体。这不应该改变答案的基本思想:不要这样做,你可能会使其变得不唯一(或增加碰撞的机会)。

这取决于 GUID 的版本以及您进行更改的位置。让我们仔细分析一下 GUID 的实际情况:

  1. GUID 有一个版本。GUID 中的第 13 个十六进制数字标记其版本。当前的 GUID 通常是使用版本 4 生成的。如果向后更改版本,则可能存在与已存在的 GUID 发生冲突的风险。向前更改它,您将面临与未来潜在的 GUID 发生冲突的风险。

  2. GUID 也有一个变体。GUID 中的第 17 个十六进制数字是变体字段。其中一些值是为了向后兼容而保留的,一个值是为了将来的扩展而保留的。因此,更改其中的某些内容意味着您可能会面临与之前生成的 GUID 或将来生成的 GUID 发生冲突的风险。

  3. GUID 的结构因版本而异。版本 4 GUID 使用(大部分 - 第 17 个十六进制数字除外)真正随机或伪随机位(在大多数实现中是伪随机的)。改变那里的一些东西,碰撞的概率保持不变。

    它对于使用哈希值的版本 3 和版本 5 GUID 应该非常相似,尽管我不记得曾经在野外见过。不过,版本 1 和版本 2 的情况就不那么严重了。它们有一个结构,根据你改变的地方,你会让事情变得困难。

  4. 版本 1 GUID 包含时间戳如果在同一时钟间隔内生成两个 GUID(因此会导致相同的时间戳),则计数器字段会递增。如果更改时间戳,则可能会与同一台计算机上较早或较晚生成的 GUID 发生冲突。如果更改计数器,则可能会与同时生成的 GUID 发生冲突,因此需要计数器作为“唯一符”。

  5. 版本 2 GUID 在版本 1 的基础上进行了扩展,并且还包含用户 ID。时间戳不太准确,包含用户或组 ID,而计数器的一部分用于指示哪个 ID(但仅对生成机器有意义)。因此,如果更改这些部分,您可能会面临与同一台计算机上其他用户生成的 GUID 发生冲突的风险。

  6. 版本 1 和 2 GUID 包括 MAC 地址。具体来说,是生成它们的计算机的 MAC 地址。这确保了来自不同机器的 GUID 是不同的,即使是在同一时刻生成的。如果计算机没有 MAC 地址,则存在后备方案,但无法保证唯一性。 MAC 地址也有一个结构,由“组织唯一标识符”(OUI;由本地管理或由 IEEE 分发)和网卡的唯一标识符组成。

    如果您对 OUI 进行更改,则可能会与使用其他制造商的网卡的计算机中生成的 GUID 发生冲突。除非您进行更改,使第一个八位位组的第二个最低有效位为 1,在这种情况下,您将切换到本地管理的 OUI,并且仅存在与具有被覆盖的 MAC 地址的计算机上生成的 GUID 发生冲突的风险(这可能会导致包括大多数具有虚拟网络硬件的 VM)。

    如果您偶然发现卡标识符,则可能会遇到与具有同一制造商的其他网卡的计算机上生成的 GUID 发生冲突的风险,或者与 MAC 地址被覆盖的计算机发生冲突的风险。

到目前为止还没有其他版本,但要点如下:GUID 需要其所有部分来确保唯一性;如果你改变了一些东西,你最终可能会得到一个不再是唯一的 GUID。所以你可能让它更像是一个神什么的。最安全的更改可能是当前版本 4 GUIDe(Windows 和 .NET 将生成的),因为它们实际上并不保证独特,而是创造非常非常不可能.

一般来说,我认为生成一个新的 GUID 会更好。这也对阅读它们的人有帮助,因为如果两个 GUID 看起来完全不同,您可以很容易地将它们区分开来。如果它们仅相差一位数,人们可能会错过更改并假设 GUID 相同。

此外,另一个地方的另一个人可能被迫做与您所做的相同的事情,也许是相同的数字,这样您最终会得到两个相同的 GUID。考虑到正常情况下发生冲突的可能性(非常低),在一个大型项目中,可能会以这种方式从同一个 GUID 派生出多个 GUID,这实际上可能是最可能的冲突原因。

进一步阅读:

  • 维基百科:GUID http://en.wikipedia.org/wiki/GUID
  • 维基百科:UUID http://en.wikipedia.org/wiki/UUID
  • Eric Lippert:GUID 指南。Part 1 http://blogs.msdn.com/b/ericlippert/archive/2012/04/24/guid-guide-part-one.aspx, part 2 http://blogs.msdn.com/b/ericlippert/archive/2012/04/30/guid-guide-part-two.aspx, part 3 http://blogs.msdn.com/b/ericlippert/archive/2012/05/07/guid-guide-part-three.aspx。 (读一下;这个人可以很好地解释,而且碰巧也在 SO 上)
  • 维基百科:MAC地址 http://en.wikipedia.org/wiki/MAC_address
  • RFC 4122:GUID 版本 https://www.rfc-editor.org/rfc/rfc4122#section-4.1.3
  • RFC 4122:变体字段 https://www.rfc-editor.org/rfc/rfc4122#section-4.1.1
  • DCE 1.1:身份验证和安全服务 – 版本 2 GUID 的描述 http://pubs.opengroup.org/onlinepubs/9696989899/chap5.htm#tagcjh_08_02_01_01
  • Raymond Chen:GUID 是全球唯一的,但 GUID 的子字符串不是 http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx
  • Raymond Chen:GUID 的设计是唯一的,而不是随机的 http://blogs.msdn.com/b/oldnewthing/archive/2012/05/23/10309199.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手动更改 GUID - 这有多糟糕? 的相关文章

  • System.Guid.NewGuid() 的随机性如何? (拿两个)

    在开始将其标记为之前重复的 读给我听 另一个问题有一个 很可能 不正确的接受答案 我不知道 NET 如何生成它的 GUID 可能只有 Microsoft 这样做 但它很可能只是调用CoCreateGuid 然而 该函数被记录为正在调用Uui
  • 在 Ruby 中生成 GUID

    我有一个问题 用 GUID 很容易解决 特别是 对于密码重置工作流程 我想将 GUID 令牌发送到用户的电子邮件并让他们使用该令牌重置密码 由于 GUID 是唯一的 因此这非常安全 并且可以避免我通过电子邮件向人们发送密码 这是有风险的 我
  • 了解 Dean Edwards 的 addevent JavaScript

    我需要帮助理解这段代码 重点是什么handler guid 为什么需要哈希表 重点是什么 if element on type handlers 0 element on type 文中的 这个 指的是什么handleEvent 元素还是a
  • 从 Oracle 的 RAW(16) 转换为 .NET 的 GUID

    我在手动调试 NET 应用程序时遇到困难 其中 Guid 值与 NET 和 Oracle 不同 Where C reads 17D89D326C2142D69B989F5201288DBF Oracle reads 329DD817216C
  • 获取 Windows XP 上现有 USB 设备的 GUID

    我需要找到连接到 Windows XP 系统的现有 USB 设备的 GUID 如何使用 WMI 或注册表来完成此操作 或者 我还应该探索其他途径吗 谢谢 附加信息 我需要找到特定已知设备的 GUID 预计不会改变 如果我需要编写一个小程序
  • 我应该使用 Path.GetRandomFileName 还是使用 Guid?

    我需要生成唯一的文件夹名称 我应该使用路径 GetRandomFileName http msdn microsoft com en us library system io path getrandomfilename 28v vs 11
  • SQL Server - 是基于 GUID 的 PK,是支持基于租户的水平分区的最佳实践

    我试图找出设计未来需要水平分区的多租户数据库架构时最好的方法是什么 数据库中的一些粗略数字 租户总数约为10 000人 每个租户存储的数据量在 500MB gt 3GB 之间变化 租户数量一开始会很小 几年后会增加到 10 000 个 因此
  • 如何在 VBA 中将 GUID 分配给 DAO 参数

    我有一段代码可以归结为 dim stmt as dao queryDef dim parId as dao parameter set stmt currentDB createQueryDef parameters id guid ins
  • 如何用C语言生成GUID?

    我想生成插入 SQLite 数据库的 guid 即数据库本身不支持 但是 我想控制某些属性 用于生成不断增加的指导值的有序性 计算机独立性 数据库是公共的 可能 可能不希望 guid 允许某人将数据追溯到特定机器 足够 的随机性 guid
  • c# System.guid 不包含 Parse 的定义

    AT Anchor System Guid Parse DataBinder Eval e Item DataItem Anchor ToString 这会抛出 System Guid does not contain a definiti
  • ASP.NET MVC 2 HiddenField 为空?

    Hi 我有一个包含 CI 属性 Guid 的 ViewClass 为了跟踪这个 CI 属性 我为其添加了一个隐藏值 如下所示 然而 这确实会呈现一个空的隐藏字段 我也尝试过 但结果相同 刚输入时 Guid 的打印方式如下 5f7a1f53
  • Binary(16) 字段截断 Guid 的尾随零

    在 C 中 我有一个byte 名为 UniqueId 的字段 我将此字段作为 Binary 16 存储在 SQL Server 数据库 EF6 中 我注意到有时 存储的 guid 是 15 个字节而不是 16 个字节 当我这样做时 这会导致
  • 与 Microsoft 完全一样生成 BIOS 制造商 HWID(来自 SHA-1 的 GUID)

    SCENARIO 我想学习 在C or VB NET 如何生成硬件 ID 基于微软开发人员为此所做的相同方法 首先 在继续之前 我必须声明这个问题是从另一个问题派生出来的一个更好的具体不同问题 像 Microsoft 一样获取硬件 ID h
  • 存储人类可读的 UUID 的最小方式是什么?

    存储人类可读且与数据库广泛兼容的 UUID 的最小方式是什么 我正在考虑使用十六进制值的某种字符数组 作为常见的方法 我认为将二进制数据 16 字节 编码为 Base64 可能是您想要的
  • 如何将 GUID 作为属性参数?

    我需要某个属性类中的 Guid 属性 如下所示 public class SomeAttribute Attribute private Guid foreignIdentificator public Guid ForeignIdenti
  • ruby base64 通过以 2 位字符开头来编码 128 位数字,以防止末尾填充

    这个问题是我之前问题的后续 如何在 Ruby 中使用自定义字符集将 UUID 转换为字符串 https stackoverflow com questions 47803212 how can i convert a uuid to a s
  • 在 MySQL 中向 BIGINT 列添加索引有帮助吗?

    我有一个包含数百万个条目的表 以及一个包含BIGINT 20 每行的唯一值 它们不是主键 但在某些操作过程中 有数千个SELECTs 在中使用此列WHERE条款 问 向该列添加索引是否有帮助当条目数量增长到数百万时 我知道它适用于文本值 但
  • GUID 是否及时订购?如果 ORDER BY 与 GUID 变量类型一起使用,最近创建的记录会晚吗?

    GUID 是否及时订购 我的意思是 如果您将 ORDER BY 与 GUID 变量类型一起使用 最近创建的记录会晚吗 在 Windows 上 GUID UUID 是使用 UuidCreate 从加密随机数生成器创建的 根据 RFC 4122
  • 使用 GUID 作为 ASP.NET MVC 数据库中的 ID

    我正在学习 ASP NET MVC 我正在关注有关的基本教程之一asp net http www asp net mvc whatisaspmvc 由于我并不总是严格遵循教程 因此我决定使用 GUID 作为标识列而不是整数 一切都工作正常
  • WIX 自动生成 GUID *?

    假设我生成产品 ID 为 的 WIX XML 文件 另外 对于每个组件 GUID 我都使用

随机推荐

  • 仅在 Extract UI 模式下显示 android:hint

    我有一个 android 布局中的 EditTexts 列表 每一个都标有一个 TextView 因此在纵向模式下不需要提示 甚至提示是多余的 但是 在横向模式下 许多人将键盘配置为全屏显示并隐藏应用程序 直到隐藏键盘并将输入注入到所选视图
  • 如何在嵌入式Linux中检测GPIO线上的中断?

    GPIO 39 上每 10ms 产生一个中断熊猫板 OMAP4 http www ti com product OMAP4460 我已在 Linux 驱动程序代码中为此注册了一个处理程序 但由于未检测到中断 因此未调用该处理程序 我在硬件级
  • Python 中的跨平台音频播放

    是否有用于音频播放的跨平台 Python 库 我的目标操作系统是 按重要性排序 Windows Linux 和 Mac OSX 需要支持的文件格式是 按重要性排序 MP3 OGG WAV 和 FLAC 这样的事情存在吗 我尝试了一些可用的
  • 模拟子组件 - Angular 2

    测试时如何模拟子组件 我有一个名为的父组件product selected其模板如下所示 section class container fluid hr section
  • parfor 和处理类

    我有一个句柄类 classdef A
  • 尝试启用推送通知时,找不到应用程序的有效“aps-environment”权利字符串

    我一直在阅读所有其他询问此错误的问题 似乎我已经遵循了他们的解决方案 但我仍然遇到这个问题 我删除了所有现有的配置文件和应用程序 ID 我创建了一个启用了推送的新应用程序 ID 我创建了一个启用了推送的开发配置文件 在 Apple 开发网站
  • 我是否想访问地址零?

    常量 0 在 C 和 C 中用作空指针 但正如问题中 指向特定固定地址的指针 https stackoverflow com questions 2389251 pointer to a specific fixed address分配固定
  • 如何计算 MySQL 查询返回的行数?

    如何计算 MySQL 查询返回的行数 获取查询结果中的总行数 您只需迭代结果并计算它们即可 你没有说明你正在使用什么语言或客户端库 但 API 确实提供了mysql num rows http dev mysql com doc refma
  • 您是否需要存储 std::async 的 std::future 返回值?

    考虑以下代码 include
  • 如何在MDX查询中的行上显示多个维度?

    我有一个叫做Sales KG在我的立方体和二维中 Groups and Formats 有没有办法在单行中显示最后一个 我有这样的疑问 select Measures Sales KG on Columns Formats Format T
  • 如何理解“协方差”和“逆变”这两句话?

    我正在阅读 深入Scala 的第一节 第一节中有两句话是关于 协方差 和 逆变 协变 T 或 extends T 是指类型可以沿着继承层次结构强制向下 逆变 T 或 super T 是指类型可以在继承层次结构中强制向上 我读过一些有关 协方
  • 为什么 Google Mocks 发现这个函数调用不明确?

    我在尝试开始使用 Google Mocks 时遇到了问题 由于某种原因它无法告诉我在EXPECT CALL宏 即使类型是一致的 我想知道为什么它不只匹配第一个函数 以及我需要做什么 添加才能使其匹配第一个函数 模拟类 class GMock
  • jquery,按值取消选择复选框

    我有很多复选框
  • 包裹两个相邻的 td

    我有一个有两列的表格 两列都是 300 像素宽 在普通计算机屏幕上宽度为 600 像素 我想修改小屏幕移动设备该表格的显示 有没有一种 CSS 方法可以使右列的单元格换行并位于左列的单元格下方 然后是下一个左侧单元格 然后是下一个右侧单元格
  • 自定义 UIPageControl 视图,用“Page X of Y”替换点

    我正在尝试找到一种方法 用 Page X of Y 的标题替换 UIPageControl 的点 因为我可能有 gt 50 个项目 我刚刚熟悉 Cocoa 我想知道最好的方法是什么 我可以子类化 UIPageControl 吗 我应该使用带
  • RTSP 帧抓取会产生拖尾、像素化和损坏的图像

    我正在尝试使用以下命令从 RTSP 流中每秒捕获一帧 ffmpeg i rtsp XXX q v 1 vf fps fps 1 strftime 1 ZZZZ H M S jpg But some of the frames are sme
  • 为什么 Rails (3+) 仍然不支持存储过程?

    我熟悉 Ruby on Rails DB MS 驱动程序和存储过程之间长期存在的又爱又恨的关系 并且自版本 2 3 2 以来我一直在开发 Rails 应用程序 然而 每隔一段时间就会出现这样的情况 SP 是比在 慢得多的 应用程序级别上组合
  • 如何在 XSLT 中打印单个

    基本上我需要在一个 if 语句中打开一个 div 并在另一个 if 语句中关闭它 我试过
  • 在 Visual Studio Code 中打开多个项目/文件夹

    如何在单个 Visual Studio Code 实例中打开多个项目 文件夹 并在单个视图中打开多个文件 对于未来的变更请求是否有任何选项 不知道为什么没有提到最简单的解决方案 你可以简单地做File gt New Window并在新窗口中
  • 手动更改 GUID - 这有多糟糕?

    手动更改生成的 GUID 并使用它有多糟糕 碰撞的可能性是否仍然微不足道 或者使用 GUID 进行操作是否危险 有时我们只是更改之前生成的 GUID 的某些字母并使用它 我们应该停止这样做吗 注意 这个答案错过了一些旧的格式 并且在不久的将