2012-09-06 6 views
1

저는 C#을 사용하고 있지만 모르는 경우에도이 질문과 함께 따라야합니다.고유 ID를 생성하는 클래스/객체

여기 내 문제가 있습니다 : 나는 그 객체들을 int ID를 기반으로 볼 수 있도록 해시 셋과 같은 데이터 구조로 유지하고자하는 객체를 가지고 있습니다. 이러한 객체에는 속성이 변경 될 수 있으므로 해시는 옵션이 아닙니다 (해시 할 때마다 상수가 필요합니다.).

public interface IUniqueIDCollection 
{ 
    // Can return any int that hasn't been requested yet. 
    public int RequestUniqueID(); 

    // Undos the requesting of an int 
    public int ReleaseUniqueID(int uniqueID); 
} 

내 초기 생각은 단지 아이디의 요청대로 증가시키는 IUniqueIDCollection의 내부 카운터를 저장하는 것입니다 : 내가 무슨 짓을했는지

는 다음과 같은 인터페이스를 개발하는 것입니다. 그러나 일단 ID가 발급되면 삭제 된 범위 또는 개별 ID를 추적해야합니다. 나는 후자가 더 좋을 것이라고 생각한다. 그러나 ID를 생성하기 위해 카운터 (또는 주기적 함수)를 사용하면 카운터가 래핑 된 후에도 ID가 연속적으로 요청되지 않은 시퀀스를 확인해야하는 문제가 발생합니다.

발견 방법은 다음과 같습니다. 한 번에 최대 5,000 개의 ID가 요청됩니다. 그러나 ID의 요청을 받고 나서 매우 자주 발표 될 것입니다. 이탈은 범위에서 발생하는 경향이 있습니다. 즉, 한 번에 100 개를 모두 요청한 다음 짧은 시간 간격으로 모두 100 개를 릴리스합니다.

나는 GUID 대신 int를 사용할 수 있지만 ID의 공간/대역폭/처리 시간을 절약하고 싶습니다.

제 질문은 : 위의 인터페이스에서 의사 코드에 주어진 의사 코드와 관련하여 요청 및 릴리스 방법이 어떻게되어야합니까?

답변

5

출시 된 ID가 즉시 재사용해도 안전하다고 확신하면 (예 : 새 ID가 최근에 출시 된 ID로 할당 된 경우 혼란스러워지는 기존 ID에 대한 부실한 참조가 없음) 출시 된 ID를 먼저 사용할 수 있습니다. 따라서 ID가 해제되면 대기열의 끝에 넣습니다. 새 ID가 요청되면 대기열에서 첫 번째 ID를 사용합니다. 대기열이 비어 있으면 내부 카운터를 증가시키고 새 번호를 알려줍니다. 이 구현의

이점 :

  • 모든 연산은 O (1). 컬렉션이나 범위를 반복하지 않습니다. 대기열의 끝에 삽입하거나, 대기열의 맨 앞에서 제거하거나, 카운터를 늘리십시오.
  • 가능한 한 빨리 큐를 사용하려고하기 때문에 메모리 사용 공간이 상당히 적어야합니다.
  • 구현이 간단합니다.

단점 : 최근에 출시 된 객체와 동일한 ID를 사용하는 새 개체를 유지하기 위해 전체 인덱스 범위를 사용하지 않도록

  • 당신은 신속 ID의 재사용됩니다.
  • ID를보고 개체의 나이를 추측 할 수도 없습니다.
+0

Perfect! 감사! –

1

거의 모든 경우에 위의 Tom Panning's보다 나쁜 아이디어 일 수 있지만, BitArray를 사용하여 사용중인 ID를 추적 할 수 있습니다.메모리 사용량은 실제 총 ID가있는 비트 수와 같습니다. 최악의 경우는 모든 32 비트 int를 매핑하기 위해 512MB가됩니다. ID를 획득 (또는 요청)하려면 0 비트를 검색해야하며 찾지 못하면 BitArray를 확장해야합니다.

아직 BitArray를 확장 할 수있는 옵션이있는 경우 (즉, 아직 512MB가 아님) 확장을 결정하기 전에 모든 BitArray를 검색하고 싶지는 않을 것입니다. 항상 같은 인덱스에서 시작하고 싶지는 않을 것입니다. 발견 한 마지막 0 개를 추적하고 거기에서 검색을 시작하는 것이 좋습니다.

내가 볼 수있는 장점 중 하나는 전체 또는 거의 모든 객체가 릴리스 된 메모리 사용입니다. 그런 다음 Tom Panning의 솔루션에는 이보다 최소 32 배 많은 메모리가 필요합니다. 그러나 일반적인 사용법에서는 솔루션의 사용량이 적을 것으로 예상됩니다.

+0

+1 경우에 따라서는 더 좋으므로 고려해야합니다. 당신이 말했듯이, 일반적으로 말해서 더 나빠요. 그래서 제가 톰을 받아 들였습니다. 답장을 보내 주셔서 감사합니다! –

관련 문제