How can I generate UUID in C#

前端 未结 5 613
不知归路
不知归路 2020-11-29 20:23

I am creating an .idl file programmatically. How do I create UUIDs for the interfaces and Methods Programmatically.

Can I generate the UUID programmatically?

相关标签:
5条回答
  • 2020-11-29 20:33

    Be careful: while the string representations for .NET Guid and (RFC4122) UUID are identical, the storage format is not. .NET trades in little-endian bytes for the first three Guid parts.

    If you are transmitting the bytes (for example, as base64), you can't just use Guid.ToByteArray() and encode it. You'll need to Array.Reverse the first three parts (Data1-3).

    I do it this way:

    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);
    

    See this answer for the specific .NET implementation details.

    Edit: Thanks to Jeff Walker, Code Ranger, for pointing out that the internals are not relevant to the format of the byte array that goes in and out of the byte-array constructor and ToByteArray().

    0 讨论(0)
  • 2020-11-29 20:40

    I have a GitHub Gist with a Java like UUID implementation in C#: https://gist.github.com/rickbeerendonk/13655dd24ec574954366

    The UUID can be created from the least and most significant bits, just like in Java. It also exposes them. The implementation has an explicit conversion to a GUID and an implicit conversion from a GUID.

    0 讨论(0)
  • 2020-11-29 20:44

    You are probably looking for System.Guid.NewGuid().

    0 讨论(0)
  • 2020-11-29 20:47

    I don't know about methods; however, the type to GUID can be done via:

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

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

    0 讨论(0)
  • 2020-11-29 20:49

    Here is a client side "sequential guid" solution.

    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
    
    
    
    
            */
    
    
    
    
    
    
    
    
        }
    }
    

    Keywords: CreateSequentialUUID SequentialUUID

    0 讨论(0)
提交回复
热议问题