Как я могу сгенерировать UUID на C #

Я программно создаю файл .idl. Как программно создать UUID для интерфейсов и методов.

Могу ли я сгенерировать UUID программно?


person Uma Shankar Subramani    schedule 12.12.2011    source источник
comment
Вы имеете в виду Guid.NewGuid()?   -  person SLaks    schedule 12.12.2011


Ответы (5)


Вероятно, вы ищете System.Guid.NewGuid().

person Tudor    schedule 12.12.2011
comment
Вы также можете сделать String UUID = Guid.NewGuid (). ToString () - person Justin; 12.12.2011
comment
GUID и UUID все одинаковые? - person Uma Shankar Subramani; 12.12.2011
comment
@Uma Shankar Subramani: GUID = глобальный уникальный идентификатор, UUID = универсальный уникальный идентификатор. Разные слова для одного и того же понятия. - person Tudor; 12.12.2011
comment
И вам нужно отформатировать GUID как строку, которая отличается от значения по умолчанию, вы можете использовать _ 1_ перегрузка, которая принимает один из нескольких спецификаторов формата. - person Michiel van Oosterhout; 03.06.2013
comment
Вы, вероятно, захотите сделать System.Guid.NewGuid().ToString("B").ToUpper(), если хотите быть совместимыми с некоторыми инструментами MS Build, которые не понимают UUID в нижнем регистре. Например, vdproj проекты установки имеют UUID в верхнем регистре и вызовут исключение, если вы укажете его в нижнем регистре. - person Mark Lakata; 20.06.2013
comment
Это не одно и то же. это то же представление, но не та же схема. Guid может быть случайным представлением чисел и цифр, в то время как UUID содержит такую ​​информацию, как данные / время и MAC-адрес. en.wikipedia.org/wiki/Universally_unique_identifier - person Idan; 03.02.2016

Будьте осторожны: хотя строковые представления для .NET Guid и (RFC4122) UUID идентичны, формат хранения - нет. .NET торгует байтами с прямым порядком байтов для первых трех Guid частей.

Если вы передаете байты (например, как base64), вы не можете просто использовать Guid.ToByteArray() и кодировать его. Вам нужно Array.Reverse первые три части (Data1-3).

Я так делаю:

var rfc4122bytes = Convert.FromBase64String("aguidthatIgotonthewire==");
Array.Reverse(rfc4122bytes,0,4);
Array.Reverse(rfc4122bytes,4,2);
Array.Reverse(rfc4122bytes,6,2);
var guid = new Guid(rfc4122bytes);

См. этот ответ для получения более подробной информации о реализации .NET.

Изменить: спасибо Джеффу Уокеру, Code Ranger, за указание на то, что внутренние компоненты не имеют отношения к формату байтового массива, который входит и выходит из конструктора байтового массива и ToByteArray().

person Ben Mosher    schedule 23.05.2013
comment
Примечание. Я понимаю, что OP, вероятно, означал Guid (поскольку он предназначен для .idl), но я только что столкнулся с этим. Итак, пожалуйста, Бингеры и гуглеры. - person Ben Mosher; 24.05.2013
comment
Я не могу это проверить, но уверены ли вы, что вам следует проверять BitConverter.IsLittleEndian, а не просто всегда менять направление. Документы для Guid.ToByteArray () называют порядок байтов с прямым порядком байтов и говорят, что конструктор совпадает. Спецификация для GUID является прямым порядком байтов. Я бы подумал, что это не должно зависеть от порядка байтов машины. - person Jeff Walker Code Ranger; 14.09.2013
comment
@JeffWalkerCodeRanger: от Эрика Липперта, давным-давно: блоги. msdn.com/b/ericlippert/archive/2004/05/25/141525.aspx - person Ben Mosher; 16.09.2013
comment
Я не понимаю, как ссылка на Эрика Липперта отвечает на этот вопрос. Посмотрите код Mono на github.com/ mono / mono / blob / master / mcs / class / corlib / System / мне кажется, что они всегда предполагают, что байты находятся в маленьком порядке байтов независимо от исходного порядка байтов. Это согласуется с моим пониманием того, что если бы это зависело от платформы, это не соответствовало бы семантике API MS или спецификации. Глядя на дизассемблированный mscorelib, кажется, что байты в массиве тоже находятся в обратном порядке. - person Jeff Walker Code Ranger; 17.09.2013
comment
Похоже, ты прав. Хотя внутренний формат хранения чувствителен к порядку байтов, конструктор и ToByteArray нет; они всегда с прямым порядком байтов. Редактировать входящие. - person Ben Mosher; 17.09.2013
comment
@JeffWalkerCodeRanger BitConverter.IsLittleEndian, постоянно возвращающий одно и то же, является деталью реализации, если вы запускаете свое приложение на платформе .NET, которая не является монофонической или Microsoft .NET CLR, или в какой-то случайный момент в будущем, когда один из этих двое решают изменить его, он не всегда может вернуть то же самое. - person Scott Chamberlain; 10.08.2014
comment
@ScottChamberlain Я не имел в виду, что BitConverter.IsLittleEndian всегда возвращал одно и то же значение. На самом деле я этого не ожидал. Я утверждал, что спецификация для GUID определяет порядок байтов с прямым порядком байтов независимо от порядка байтов машины, который отражает BitConverter.IsLittleEndian. Хотя я ссылался на исходный код MS, я сделал это только потому, что документация в этой области была немного скудной. Возможно, вас смутил тот факт, что ответ был изменен. Раньше он содержал вызов BitConverter.IsLittleEndian, который был удален после того, как я выступил против него. - person Jeff Walker Code Ranger; 13.08.2014
comment
@ScottChamberlain Удаление BitConverter.IsLittleEndian было сделано именно для того, чтобы гарантировать правильное поведение в моно или любой будущей реализации платформы .NET. Если вы проверите историю редактирования ответа, вы увидите старую версию. Текущая версия (без BitConverter.IsLittleEndian верна). Надеюсь, это поможет прояснить ситуацию. - person Jeff Walker Code Ranger; 13.08.2014

Вот решение "последовательного руководства" на стороне клиента.

http://www.pinvoke.net/default.aspx/rpcrt4.uuidcreate

using System;
using System.Runtime.InteropServices;


namespace MyCompany.MyTechnology.Framework.CrossDomain.GuidExtend
{
    public static class Guid
    {

        /*

        Original Reference for Code:
        http://www.pinvoke.net/default.aspx/rpcrt4/UuidCreateSequential.html

        */


        [DllImport("rpcrt4.dll", SetLastError = true)]
        static extern int UuidCreateSequential(out System.Guid guid);

        public static System.Guid NewGuid()
        {
            return CreateSequentialUuid();
        }


        public static System.Guid CreateSequentialUuid()
        {
            const int RPC_S_OK = 0;
            System.Guid g;
            int hr = UuidCreateSequential(out g);
            if (hr != RPC_S_OK)
                throw new ApplicationException("UuidCreateSequential failed: " + hr);
            return g;
        }


        /*

        Text From URL above:

        UuidCreateSequential (rpcrt4)

        Type a page name and press Enter. You'll jump to the page if it exists, or you can create it if it doesn't.
        To create a page in a module other than rpcrt4, prefix the name with the module name and a period.
        . Summary
        Creates a new UUID 
        C# Signature:
        [DllImport("rpcrt4.dll", SetLastError=true)]
        static extern int UuidCreateSequential(out Guid guid);


        VB Signature:
        Declare Function UuidCreateSequential Lib "rpcrt4.dll" (ByRef id As Guid) As Integer


        User-Defined Types:
        None.

        Notes:
        Microsoft changed the UuidCreate function so it no longer uses the machine's MAC address as part of the UUID. Since CoCreateGuid calls UuidCreate to get its GUID, its output also changed. If you still like the GUIDs to be generated in sequential order (helpful for keeping a related group of GUIDs together in the system registry), you can use the UuidCreateSequential function.

        CoCreateGuid generates random-looking GUIDs like these:

        92E60A8A-2A99-4F53-9A71-AC69BD7E4D75
        BB88FD63-DAC2-4B15-8ADF-1D502E64B92F
        28F8800C-C804-4F0F-B6F1-24BFC4D4EE80
        EBD133A6-6CF3-4ADA-B723-A8177B70D268
        B10A35C0-F012-4EC1-9D24-3CC91D2B7122



        UuidCreateSequential generates sequential GUIDs like these:

        19F287B4-8830-11D9-8BFC-000CF1ADC5B7
        19F287B5-8830-11D9-8BFC-000CF1ADC5B7
        19F287B6-8830-11D9-8BFC-000CF1ADC5B7
        19F287B7-8830-11D9-8BFC-000CF1ADC5B7
        19F287B8-8830-11D9-8BFC-000CF1ADC5B7



        Here is a summary of the differences in the output of UuidCreateSequential:

        The last six bytes reveal your MAC address 
        Several GUIDs generated in a row are sequential 
        Tips & Tricks:
        Please add some!

        Sample Code in C#:
        static Guid UuidCreateSequential()
        {
           const int RPC_S_OK = 0;
           Guid g;
           int hr = UuidCreateSequential(out g);
           if (hr != RPC_S_OK)
             throw new ApplicationException
               ("UuidCreateSequential failed: " + hr);
           return g;
        }



        Sample Code in VB:
        Sub Main()
           Dim myId As Guid
           Dim code As Integer
           code = UuidCreateSequential(myId)
           If code <> 0 Then
             Console.WriteLine("UuidCreateSequential failed: {0}", code)
           Else
             Console.WriteLine(myId)
           End If
        End Sub




        */








    }
}

Ключевые слова: CreateSequentialUUID SequentialUUID

person granadaCoder    schedule 20.08.2013

Я не знаю о методах; однако тип для GUID может быть выполнен с помощью:

Guid iid = System.Runtime.InteropServices.Marshal.GenerateGuidForType(typeof(IFoo));

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.generateguidfortype.aspx

person csharptest.net    schedule 12.12.2011

У меня есть GitHub Gist с Java-реализацией UUID на C #: https://gist.github.com/rickbeerendonk/13655dd24ec574954366

UUID может быть создан из младшего и старшего битов, как в Java. Это также их разоблачает. Реализация имеет явное преобразование в GUID и неявное преобразование из GUID.

person Rick Beerendonk    schedule 10.08.2014