Дубликат GUID на виртуальной машине - PullRequest
9 голосов
/ 20 апреля 2011

Мне удалось успешно воспроизвести тот же GUID (да, вы правильно прочитали), используя простую скретч-программу на C # .NET при восстановлении снимков внутри VMWare.Клиентская виртуальная машина - 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 ]

5 голосов
/ 12 сентября 2011

Можете ли вы опубликовать один из GUID.Изображение кажется поврежденным.

См. http://en.wikipedia.org/wiki/Globally_unique_identifier, в частности, «Алгоритм».Вероятно, платформа, которую вы используете под Windows 2008 R2 x64, использует GUID версии 4.В этом случае GUID генерируется с использованием псевдослучайных данных.Поскольку процессор находится в том же состоянии, потому что вы возвращаете его из того, что, как я полагаю, является снимком памяти (верно?), А не снимком с выключенным питанием, вы получаете повторяющиеся числа от генератора псевдослучайных чисел.

ЭтоОперационная система довольно часто инициализирует псевдослучайное начальное число один раз при запуске, последовательно выбирая числа из списка, чтобы создать случайное число.Это происходит в мире Linux, и вполне вероятно, что вы наблюдаете такое же поведение.Поскольку последовательность чисел не была повторно инициализирована, и вы возвращаетесь к образу памяти, вы получаете те же числа.

Используя GUID Generator из VS 2010, я получил V4 GUID в Windows 7.

Чтобы решить эту проблему, я сначала попытался бы применить исправления безопасности Windows, которые могут решить проблему.Скорее всего, проблема заключается в ole32.dll, который вызывается в методе Guid.NewGuid, и, возможно, в более новых версиях повторяется псевдослучайное число, поскольку вы не получаете его в более новых версиях Windows.

В противном случае, чтобы обойти эту проблемуна текущей платформе вы могли бы:

  1. Создать собственный GUID из MAC и данных времени, как указано в спецификации OSF.

  2. Попробуйте позвонитьnew Random () до вашего вызова NewGuid.Вероятно, это будет длинный выстрел, но его легко протестировать.

  3. Не возвращаться из образа памяти.

Надеюсь, это поможет.Без сомнения, вы не первый, кто столкнулся с этой проблемой, поэтому более новые платформы, вероятно, вернулись к предыдущему методу использования MAC и временных данных.

0 голосов
/ 13 сентября 2011

Я бы не ожидал ЛЮБОЙ уникальности от GUID, сгенерированных на машине без физической сетевой карты.MAC-адрес виртуальной карты практически гарантированно повторяется на клонах той же виртуальной машины.

0 голосов
/ 20 апреля 2011

GUID не гарантируется быть уникальным, но вероятность крайне мала.Может быть, вам повезло (не):)

...