虚拟机上的重复GUID

Bre*_*ury 9 c# vmware guid 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*ite 5

可以请你发一个GUID.图像似乎被打破了.

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

操作系统在启动时初始化一次伪随机种子是相当常见的,顺序地从列表中拉出数字以使得出现随机数.这种情况发生在Linux世界中,很可能您正在观察相同的行为.由于数字序列尚未重新初始化,并且您正在恢复到内存映像,因此您获得的数字相同.

使用VS 2010中的GUID Generator我在Windows 7上获得了V4 GUID.

要解决此问题,我首先尝试应用可能解决问题的Windows安全修复程序.问题主要在于在Guid.NewGuid方法中调用的ole32.dll,并且可能是较新的版本重新编写了伪随机数,因为你没有在较新的Windows版本上得到这个.

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

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

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

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

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


Kon*_*Kon 0

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