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)
鉴于滴答计数不同,有没有人可以说明这是如何可行的?
可以请你发一个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版本上得到这个.
否则,要在当前平台上解决此问题,您可以:
根据OSF规范中指定的MAC和时间数据生成您自己的GUID.
尝试在NewGuid调用之前调用新的Random().这可能是一个很长的镜头,但很容易测试.
不要从内存映像恢复.
希望这可以帮助.毫无疑问,你不是第一个遇到这个问题的人,这就是为什么较新的平台可能会恢复到之前使用MAC和时间数据的方法.