2011-04-06 4 views
6

어떻게 C#으로 항상 17 자의 고유 영숫자 데이터를 생성 할 수 있습니까?고유 한 영숫자를 생성하는 방법?

+3

당신은 결코 유일한 가치를 보장 할 수 없습니다. 유한 시스템에는 유일무이 한 것이 없습니다. –

+0

Guid.NewGuid(). ToString ("N")을 사용 해본 적이 있습니까? Substring (0,17) 위와 같이 고유해야하는 방식을 결정해야합니다. ~ F :-) –

+0

@ DanielA.White [이 문서] (http://www.ietf.org/rfc/rfc4122.txt)의 3 페이지를 기반으로 GUID 클래스는 고유 한 값을 생성 할 수 있습니다. – Amir

답변

5

새로운 Guid를 생성하고이를 modulo 62로 17 번 나눕니다. 각 숫자는 위에 설명 된 char 배열의 인덱스입니다 ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW XYZ1234567890"). Guid를 사용하면 Guid만큼이나 고유 한 가치를 보장 할 수 있습니다. 당신이 잃는 독특한 비트에 관심을하는 경우

이 같은 MD5로 GUID를 해시 수

Guid guidValue = Guid.NewGuid(); 
MD5 md5 = MD5.Create(); 
Guid hashed = new Guid(md5.ComputeHash(guidValue.ToByteArray())); 

UPDATE 가이 형식

을에 의해 생성 된 GUID로이 문서 (RFC 4122)에 따르면 및 비교 C#, 그들은 임의의 유형입니다. xxxxxxxx-xxxx-4xxx-Vxxx-xxxxxxxxxxxx,

  • x 난수와
  • V는 YY는 두 개의 랜덤 비트는 10yy 같은 비트 레이아웃 개수이다 :

    이 타입은 다음 패턴을 갖는다.

여기에서 우리는 128 개 중 122 개의 임의의 비트를 갖습니다. 따라서 독창성 측면에서 Guid는 단순히 큰 난수이며 다른 임의의 숫자 생성 알고리즘을 자유롭게 사용할 수 있습니다. 88 비트 난수를 생성합니다 (예 : RNGCryptoServiceProvider).

물론 Guids를 생성하는 데 사용되는 방법은 이후 버전의 프레임 워크에서 변경 될 수 있지만 Guid.NewGuid()는 코드 측면에서 저렴한 난수 생성기처럼 보입니다.

+0

+1입니다. GUID는 얻을 수있는만큼 고유하므로이 알고리즘은 최대한의 고유성을 보존합니다. –

+1

@Cosmin : GUID가 생성 된 방법을 모른 채로 가능한 많은 GUID의 고유성을 보장한다고 보장 할 수는 없습니다. 이 알고리즘은 유일성을 보장하는 모든 비트를 잃어 버릴 수 있습니다 (나는 그렇게 말하는 것은 아니지만 이론적 인 가능성이 있습니다). – LukeH

+0

@LukeH : 게시물 이후에 ... 나는 GUID의 나머지 부분을 큰 108 비트 소수로 나눠서이 문제를 해결할 것임을 알았습니다. 또는 일부 부분 XOR-ing을 수행하여 처음 16 바이트의 모든 비트의 영향을받는 12 바이트로 작업하는지 확인하십시오. 물론 초기 GUID와 동일한 속성을 가질 수는 없지만 꽤 좋을 것입니다. –

2

당신은 하드 코드 문자 집합을 가질 수 있습니다 -

char[] chars = new char[62]; 
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW XYZ1234567890".ToCharArray(); 

그런 다음 62 0 사이의 임의의 숫자를 사용하여, 당신은 임의의 문자 각 시간을 얻을하고 문자열에 추가 할 수 있습니다.

그러나 언젠가는 차선을 따라 가려는 것을 보장 할 수 없으며, 중복 된 영숫자 문자열도받지 못할 것입니다.

가능하다면 GUID을 사용하지 않으시겠습니까?

+1

GUID가 해당 범위 (128 비트) 내에서 고유성을 "보장"할 수있는 경우 왜 17 자의 A-Za-z0-9 문자열은 자체 범위 (대략 100 비트)와의 고유성을 "보장"하지 못합니까? 올바른 알고리즘을 사용하면 반복하기 전에 2 ** 100 고유 문자열을 생성 할 수 있습니다. – LukeH

+1

17 문자 문자열이 생성되었습니다. 고유성을 검사하는 알고리즘이 있다면 보장 할 수 있습니다. 그렇지 않다. –

3

당신은 시도 할 수 ... GetRandomFileName 방법은 폴더 이름이나 파일 이름으로 사용할 수있는 강력하게 암호화, 임의의 문자열을 반환 http://msdn.microsoft.com/en-us/library/system.io.path.getrandomfilename.aspx

.

또는 원하는대로.

+0

이 방법에는 제한이 있습니다. 각 호출에서 8.3 형식의 파일/폴더 이름 (예 : "qwer176d.d9s")을 제공하므로 소문자로 된 영숫자 문자는 11 자 밖에 없습니다. – Artemix

관련 문제