【问题标题】:Duplicate GUID on Virtual Machine虚拟机上的重复 GUID
【发布时间】:2011-04-20 11:26:35
【问题描述】:

在恢复 VMWare 中的快照时,我已经成功地使用简单的 C#.NET 临时程序重现了相同的 GUID(是的,您没看错)。客户端虚拟机是 Windows Server 2008 R2 64 位。我已经尝试过 Windows XP 和 Windows 7 64 位客户端,但结果不成功。我使用的 VMWare 版本是 6.5.3 build-185404。我所做的只是恢复到以前的快照,将暂存程序复制到虚拟机,然后运行它。

为那些不相信的人提供一些证据(我不怪你):http://i.imgur.com/KkSdr.png

这是临时程序的代码:

using System;
using System.Globalization;

namespace DuplicateGuid
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(String.Format(CultureInfo.InvariantCulture, "{0} {1}", Guid.NewGuid(), DateTime.Now.Ticks));

            Console.ReadKey();
        }
    }
}

鉴于滴答计数不同,有人能解释一下这是怎么可能的吗?

【问题讨论】:

  • 听起来像是 MS Windows Server 团队的错误。
  • 这很容易重复吗?每次您进行还原并再次运行程序后都会发生这种情况吗?对于踢,将程序更改为输出 10 个 GUID,并查看是否所有 10 个都重复。
  • 是的,这是可重现的。我明天可以上班,在恢复 VMWare 快照后可能会得到相同的 GUID。至于快速连续重复多个GUID;我不太确定。但无论是 1 个还是 1000 个可重现的 GUIDS,问题仍然存在。
  • 我不确定我是否遵循您的措辞:“我已经尝试过 Windows XP 和 Windows 7 64 位客户端,但结果不成功。” 你在定义什么作为“不成功”?您的意思是您在所有这些平台上都获得了重复的 GUID?还是您的意思是问题与 Server 2008 R2 64 位有关?
  • 不成功意味着无法成功复制 GUID。该问题似乎与 Windows Server 2008 R2 64 位 VMWare 客户操作系统有关。我认为人们开始忽略这里的重点。我能够重现 GUID,这是我应该能够做到的。我的问题是;鉴于我所描述的情况,有人知道这是如何发生或为什么发生的吗?

标签: c# guid vmware virtual-machine


【解决方案1】:

能否请您发布其中一个 GUID。图片好像坏了。

请参阅http://en.wikipedia.org/wiki/Globally_unique_identifier,特别是“算法”。您在 Windows 2008 R2 x64 下使用的平台很可能正在使用版本 4 GUID。在这种情况下,GUID 是使用伪随机数据生成的。由于 CPU 处于相同状态,因为您将其从我假设的内存快照(正确?)而不是关闭的快照中恢复,因此您从伪随机生成器中获得了重复的数字。

操作系统在启动时初始化一个伪随机种子是相当常见的,它会从列表中顺序拉取数字,以显示为随机数。这发生在 Linux 世界中,您很可能正在观察相同的行为。因为数字序列尚未重新初始化,并且您正在恢复到内存映像,所以您得到了相同的数字。

使用 VS 2010 中的 GUID 生成器,我在 Windows 7 上获得了 V4 GUID。

要解决此问题,我将首先尝试应用可能解决此问题的 Windows 安全修复程序。问题很可能出在 Guid.NewGuid 方法中调用的 ole32.dll 上,并且可能较新的版本会重新植入伪随机数,因为您在较新的 Windows 版本上没有得到这个。

要在当前平台上解决此问题,您可以:

  1. 根据 OSF 规范中指定的 MAC 和时间数据生成您自己的 GUID。

  2. 尝试在调用 NewGuid 之前调用 new Random()。这可能是一个很长的尝试,但很容易测试。

  3. 不要从内存映像中恢复。

希望这会有所帮助。毫无疑问,您不是第一个遇到此问题的人,这就是为什么较新的平台可能会恢复到以前使用 MAC 和时间数据的方法。

【讨论】:

    【解决方案2】:

    GUID 不保证唯一,但概率极小。也许你(不)走运。 :)

    【讨论】:

    • 但是 3 次(在示例中)?我也可以继续复制它们。我可以在其他虚拟机(使用相同的客户操作系统)中发布前几天发生的这种情况的屏幕截图。基本上,GUID 可以在还原快照后生成。这肯定是不可能的。
    • 好吧,显然这里还有其他事情发生。
    【解决方案3】:

    我不希望在没有物理网卡的机器上生成的 GUID 有任何唯一性。虚拟卡的 MAC 地址实际上可以保证在同一 VM 的克隆上重复。

    【讨论】:

    • MAC 地址不用于 v4 GUID。 .Net 制作 v4 GUID。
    猜你喜欢
    • 2011-01-09
    • 2021-09-10
    • 2021-06-15
    • 2015-01-31
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 2022-06-18
    相关资源
    最近更新 更多