Структура GUID .NET - PullRequest
       16

Структура GUID .NET

1 голос
/ 30 ноября 2010

http://msdn.microsoft.com/en-us/library/system.guid.aspx

Как это работает?Как это гарантирует уникальный идентификатор?Это зависит только от вероятности или есть еще один трюк?Могу ли я всегда доверять ему, чтобы дать уникальный идентификатор или в каких случаях мне следует избегать guid?

Ответы [ 5 ]

7 голосов
/ 30 ноября 2010

Вот забавная маленькая программа:

class Program
{
    static void Main(string[] args)
    {
        var guids = new HashSet<string>();
        var sw = Stopwatch.StartNew();

        while(true)
        {
            var guid = Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
            if (guids.Contains(guid)) break;
            guids.Add(guid);
        }

        Console.WriteLine("Duplicate found in {0} ms, after {1} items.", sw.ElapsedMilliseconds, guids.Count);
        Console.ReadLine();
    }
}

Бьюсь об заклад, у вас не хватит памяти, прежде чем он найдет дурака;)

Редактировать: Даже при использовании только половины Guid.

3 голосов
/ 30 ноября 2010

Guid не гарантирует уникальный идентификатор, у него очень низкая вероятность создания дубликата.

1 голос
/ 30 ноября 2010

Используется специальный алгоритм, предназначенный для создания уникальных идентификаторов.Да, они могут столкнуться, но это маловероятно.Также см. этот тесно связанный вопрос .

1 голос
/ 30 ноября 2010

Прежде всего, структура Guid сама по себе ничего не гарантирует, вы можете сами создать множество направляющих с помощью явного конструктора: var myGuid = new Guid(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }); Таким образом, вы можете создать сколько угодно идентичных направляющих.

Но яПредположим, вы имеете в виду Guids, созданный статическим методом Guid.NewGuid().В разделе замечаний отмечается, что вероятность того, что Guid является всеми нулями или равен другому Guid, мала.

Вы также можете прочитать RFC , который описывает, как случайность в Guidсоздан.

0 голосов
/ 30 ноября 2010

.NET Guid.NewGuid () фактически вызывает функцию CoCreateGuid , найденную в ole32.dll, которая является частью "ядра" Windows.

CoCreateGuid вызывает функцию UuidCreate, котораясоздает такую ​​вещь , что на самом деле является «низким уровнем» Guid.

Из того, что я прочитал и понял (не официальный ответ), он генерируется с использованием комбинации MAC-адреса машинытекущее системное время (количество миллисекунд, прошедшее с 01.01.1970) и, возможно, также случайное число, но я не уверен в этом.

Избегайте использования GUID в случаях, описанных в разделе «Вопросы безопасности»в разделе ссылка , опубликованном Альбином.

Ответы на все остальные ваши вопросы в других ответах, повторять нет смысла. :)

...