2016-09-08 2 views
0

개체를 가져 와서 해당 개체를 나타내는 GUID를 가져 오려고합니다.개체를 GUID/UUID

나는 그것이 많은 것을 수반한다는 것을 안다. 나는 일반적인 어플리케이션을위한 충분한 솔루션을 찾고있다.

내 특정 사용 사례는 캐싱을위한 것이며, 캐싱 할 대상을 만드는 데 사용 된 개체가 이미 과거에 만들었 음을 알고 싶습니다. 2 가지 유형의 객체가 있습니다. 각 유형은 공용 속성 만 포함하고 list/ienumable을 포함 할 수 있습니다.

객체를 가정 내 첫번째 생각은 (기본 jsonserlizer 또는 newtonsoft를 통해) JSON으로 직렬화하고 JSON 문자열을 여기 요지 How can I generate a GUID for a string?

의 상세한 UUID는 버전 5로 그 변환하는 것이었다 직렬화 될 수있다

두 번째 방법은 직렬화 할 수없는 경우 (예 : 사전 포함) 공용 속성에 반사를 사용하여 고유 한 문자열을 생성 한 다음이를 UUID 버전 5로 변환하는 것입니다.

두 가지 방법 모두 uuid 버전을 사용합니다 5 guid로 문자열을 가져옵니다. 유효한 uuid 5 guids를 만드는 입증 된 C# 클래스가 있습니까? 요점은 좋아 보이지만 확실하길 원합니다.

나는 C# 네임 스페이스를 만들고 유형 이름을 uuid 5의 네임 스페이스로 만들려고했다. 네임 스페이스를 올바르게 사용하고 있는가?

내 첫 번째 접근 방식은 내 간단한 사용 사례에 충분하지만 두 번째 접근 방식을보다 유연하게 탐색하고자했습니다.

guid를 만들면 합당한 고유성이 보장 될 수 없으므로 오류가 발생합니다. 확실히 복잡한 복잡한 객체는 실패 할 것입니다. 리플렉션을 사용하는 경우 그 사실을 어떻게 알 수 있습니까?

두 번째 방법에 대한 새로운 접근 방식이나 우려 사항/구현 방법을 찾고 있습니다.

+0

당신이 *는 * 해시라고 무엇을 의미. 예를 들어, MD5를 사용할 수 있습니다. – Robert

+0

'GetHashCode'를 찾고 계시지 않습니까? https://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=vs.110).aspx –

+0

@tomas 해시 코드가 고유 한 것으로 보장되지는 않으며 충돌이 발생하지 않을 것입니다. 또한 해당 객체 유형에만 해당됩니다. – ParoX

답변

-1

다른 사람들이 의견에서 말한 것처럼 int을 키로 사용하고자한다면 GetHashCode이 당신을 위해 속임수를 쓸 수도 있습니다. 그렇지 않다면, 당신은 같은 것을 시도해 볼 수도 길이 (16)의 byte[] 소요 Guid 생성자가 다음

using System.Linq; 
class Foo 
{ 
    public int A { get; set; } 
    public char B { get; set; } 
    public string C { get; set; } 
    public Guid GetGuid() 
    { 
     byte[] aBytes = BitConverter.GetBytes(A); 
     byte[] bBytes = BitConverter.GetBytes(B); 
     byte[] cBytes = BitConverter.GetBytes(C); 
     byte[] padding = new byte[16]; 
     byte[] allBytes = 
      aBytes 
       .Concat(bBytes) 
       .Concat(cBytes) 
       .Concat(padding) 
       .Take(16) 
       .ToArray(); 
     return new Guid(allBytes); 
    } 
} 
+0

이것은이 클래스와 관련이 있습니다. 나는 반사를 통해 바이트를 얻는 것이 thng 일 수 있다고 생각한다. 또한 해시 코드는 고유 한 것으로 보장되지 않으며 전역이 아닙니다. 클래스 A 해시 코드는 클래스 B와 같을 수 있습니다. – ParoX

관련 문제