C #에서 UUID를 생성하는 방법


137

프로그래밍 방식으로 .idl 파일을 만들고 있습니다. 프로그래밍 방식으로 인터페이스 및 메소드에 대한 UUID를 작성하는 방법

프로그래밍 방식으로 UUID를 생성 할 수 있습니까?


25
당신은 의미 Guid.NewGuid()합니까?
SLaks December

답변:


220

당신은 아마 찾고 있습니다 System.Guid.NewGuid().


33
String UUID = Guid.NewGuid (). ToString ()
Justin

10
GUID와 UUID는 모두 동일합니까?
Uma Shankar Subramani

17
@Uma Shankar Subramani : GUID = 글로벌 고유 식별자, UUID = 범용 고유 식별자. 같은 개념에 대한 다른 단어.
Tudor

1
GUID를 기본값과 다른 문자열로 형식화해야 ToString(string format)합니다. 여러 형식 지정자 중 하나를 허용 하는 오버로드를 사용할 수 있습니다 .
Michiel van Oosterhout 2016 년

7
System.Guid.NewGuid().ToString("B").ToUpper()소문자 UUID를 이해할 수없는 일부 MS 빌드 도구와 호환되기를 원할 것입니다 . 예를 들어, vdproj설치 프로젝트에는 대문자 UUID가 있으며 소문자로 예외를 발생시킵니다.
Mark Lakata

43

.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의 Jeff Walker에게 감사드립니다 ToByteArray().


참고 : OP Guid가 .idl을 의도했기 때문에 OP가 의미 할 수 있음을 알았지 만 방금 이것에 부딪 쳤습니다. 여기 Bingers와 Google 직원이 있습니다.
벤 모셔

1
나는 이것을 테스트 할 수는 없지만 항상 반전하지 않고 BitConverter.IsLittleEndian을 확인해야한다고 확신합니까? Guid.ToByteArray () 용 문서는 리틀 엔디안으로 바이트 순서를 호출하고 생성자가 일치한다고 말합니다. GUID 사양은 리틀 엔디안입니다. 나는 그것이 기계 바이트 순서와 독립적이어야한다고 생각할 것입니다.
Jeff Walker 코드 레인저

@JeffWalkerCodeRanger : Eric Lippert에서, 오래 전 : blogs.msdn.com/b/ericlippert/archive/2004/05/25/141525.aspx
Ben Mosher

Eric Lippert 링크가 질문에 어떻게 대답하는지 모르겠습니다. github.com/mono/mono/blob/master/mcs/class/corlib/System/ 의 모노 코드를 보면 기본 엔디안과 상관없이 바이트가 거의 엔디안 순서라고 가정하고 있습니다. 그것은 플랫폼에 의존한다면 MS API 또는 사양의 의미와 일치하지 않을 것이라는 나의 이해와 일치합니다. 분해 된 mscorelib를 살펴보면 배열의 바이트도 거의 엔디안 순서라고 가정합니다.
Jeff Walker 코드 레인저

당신이 옳은 것 같습니다. 내부 저장소 형식은 엔디안에 민감하지만 생성자와 ToByteArray그렇지 않습니다. 그들은 항상 lil'-endian입니다. 수신을 편집하십시오.
벤 모셔

3

다음은 클라이언트 측 "순차 GUID"솔루션입니다.

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



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.