Làm cách nào tôi có thể tạo UUID trong C #


137

Tôi đang tạo một tệp .idl theo chương trình. Làm cách nào để tạo UUID cho các giao diện và Phương thức theo chương trình.

Tôi có thể tạo UUID theo chương trình không?


24
Ý bạn là Guid.NewGuid()sao?
SLaks

Câu trả lời:


220

Bạn có thể đang tìm kiếm System.Guid.NewGuid().


33
Bạn cũng có thể thực hiện Chuỗi UUID = Guid.NewGuid (). ToString ()
Justin

10
GUID và UUID đều giống nhau?
Uma Shankar Subramani

17
@Uma Shankar Subramani: GUID = Định danh duy nhất toàn cầu, UUID = Định danh duy nhất toàn cầu. Các từ khác nhau cho cùng một khái niệm.
Tudor

1
Và bạn cần định dạng GUID dưới dạng một chuỗi khác với mặc định, bạn có thể sử dụng ToString(string format)quá tải chấp nhận một trong một số chỉ định định dạng.
Michiel van Oosterhout

7
Bạn có thể sẽ muốn làm System.Guid.NewGuid().ToString("B").ToUpper()nếu bạn muốn tương thích với một số công cụ MS Build không thể hiểu UUID chữ thường. Ví dụ, vdprojcác dự án thiết lập có UUID viết hoa và sẽ đưa ra một ngoại lệ mà bạn đưa ra cho chữ thường.
Mark Lakata

43

Hãy cẩn thận: trong khi các biểu diễn chuỗi cho .NET Guid và (RFC4122) UUID giống hệt nhau, định dạng lưu trữ thì không. .NET giao dịch theo byte nhỏ về cuối cho ba Guidphần đầu tiên .

Nếu bạn đang truyền các byte (ví dụ, như base64), bạn không thể chỉ sử dụng Guid.ToByteArray()và mã hóa nó. Bạn sẽ cần đến Array.Reverseba phần đầu tiên (Data1-3).

Tôi làm theo cách này:

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

Xem câu trả lời này để biết chi tiết triển khai .NET cụ thể.

Chỉnh sửa : Cảm ơn Jeff Walker, Code Ranger, vì đã chỉ ra rằng các phần bên trong không liên quan đến định dạng của mảng byte đi vào và ra khỏi hàm tạo mảng byte và ToByteArray().


Lưu ý: Tôi nhận ra OP có thể có nghĩa Guid(vì nó dành cho .idl), nhưng tôi chỉ gặp phải vấn đề này. Vì vậy, ở đây bạn đi, Bingers và nhân viên Google.
Ben Mosher

1
Tôi không thể kiểm tra điều này, nhưng bạn có chắc chắn nên kiểm tra BitConverter.IsLittleEndian thay vì luôn luôn đảo chiều. Các tài liệu cho Guid.ToByteArray () gọi thứ tự byte là endian nhỏ và nói rằng hàm tạo khớp với. Thông số kỹ thuật cho GUID là ít endian. Tôi nghĩ rằng nó nên độc lập với thứ tự byte máy.
Kiểm lâm viên Jeff Walker Code

@JeffWalkerCodeRanger: từ Eric Lippert, từ rất lâu rồi: blog.msdn.com/b/ericlippert/archive/2004/05/25/141525.aspx
Ben Mosher

Tôi không thấy cách liên kết Eric Lippert trả lời câu hỏi. Nhìn vào mã Mono tại github.com/mono/mono/blob/master/mcs/ class / corlib / System / trộm , tôi thấy rằng họ luôn cho rằng các byte theo thứ tự endian nhỏ bất kể tính cuối cùng của bản địa. Điều đó phù hợp với sự hiểu biết của tôi rằng nếu nó phụ thuộc vào nền tảng, nó sẽ không phù hợp với ngữ nghĩa của MS api hoặc thông số kỹ thuật. Nhìn vào mscorelib đã tháo rời, có vẻ như giả sử các byte trong mảng cũng theo thứ tự endian nhỏ.
Jeff Walker Code Ranger

Có vẻ như bạn đúng. Trong khi định dạng lưu trữ nội bộ là nhạy cảm về thời gian, thì hàm tạo và ToByteArraykhông; họ luôn luôn là người cuối cùng. Chỉnh sửa đến.
Ben Mosher

3

Đây là một giải pháp "hướng dẫn tuần tự" phía khách hàng.

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




        */








    }
}

Từ khóa: CreatSequentialUUID SequentialUUID



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.