虚拟机上的重复GUID

时间:2011-04-20 11:26:35

标签: c# guid vmware virtual-machine

在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();
        }
    }
}

鉴于滴答计数不同,有没有人能说明这是如何可能的?

3 个答案:

答案 0 :(得分:5)

可以请你发布其中一个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调用之前调用新的Random()。这可能是一个长镜头,但很容易测试。

  3. 请勿从内存映像恢复。

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

答案 1 :(得分:0)

不保证GUID是唯一的,但概率非常小。也许你有幸(非)幸运。 :)

答案 2 :(得分:0)

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