2012-01-25 3 views
2

제 작품에는 많은 사용자가 있으며 각 사용자는 홈 디렉토리에 파일 세트를 가지고 있습니다. 몇 가지 사전 정의 된 규칙으로 인해 사용자 파일 내용과 생성 시간에 따라 각 파일에 UID (고유 ID)를 부여했습니다. 하지만 이제는 사용자 계정의 파일 수가 1 백만 개를 초과 할 수 없음을 알게되었습니다. 현재 UID는 약 32 자입니다. 현재 uidl이 NoSQL 데이터베이스에서 많은 공간을 사용하고 있기 때문에 약 6 (이상적인 조건) 문자로 약 10-12 문자까지 UID를 내릴 수있는 방법이 있습니까?생성/압축 고유 키

현재 UIDL는 timestamp.prrocess_whichcreated_it.size 날 문제를 바꿔 보자

EDIT 것 같습니다. 내가 실제로 필요로하는 것은 압축 알고리즘입니다 : 예 :

나는 1,000,000 개의 문자열 (각 고유)과 각 32 자의 목록을 가지고 있습니다. F (string) = s2와 같은 압축 함수 f가 필요합니다. 여기서 S2는 길이가 10 자이고 모든 S2 문자열은 고유하게 매핑됩니다.

+0

UID 또는이 UID를 작은 범위로 변경하기위한 방법을 찾을 때마다 실행될 해시 함수를 찾고 있습니까? – amit

+0

@amit : 이전 UID를 압축하고 싶습니다. 현재 UID를 사용할 수 있으면 좋겠지 만 새로운 것을 계산할 수 있으면 좋을 것입니다. 이상적으로 H (C.UIDL) = newuidl –

+1

그럼 정렬하고 바꾸지 않는 이유는 무엇입니까? 모든 UID를 정렬하고 정렬 된 목록의 이전 UID 색인을 나타내는 새로운 UID로 이전 UID를 바꾸십시오. 그것은 독특하고 최적 일 것입니다. 또는 당신이 정말로 의미하는 것을 놓치고 있습니까? : | – amit

답변

1

UID를 정렬하고 이전 UID를 인덱스를 나타내는 새 UID로 바꿉니다. 기존의 UID의

단순화 된 의사 코드의 정렬 된 배열에 그 같이한다 : 그것은 매우 어려운 고유 한 ID가 그것을 압축하고 UNIQUE를 유지 취할

sorted <- sort(UID's) 
for each file: 
    file.UID <- sorted.indexOf(file.UID) 
+0

이렇게 할 수는 없습니다. 이전 uid에서 항상 새로운 uid를 가져와야합니다. 따라서 H (prev) = newuid, bcz와 같은 함수가 필요합니다. 이전 위치의 데이터가 여러 위치에 존재할 때 바꿀 수는 없습니다. –

1

. 당신은 충돌에 빠지기 쉽습니다.

@ amit의 제안은 실제로 가장 좋습니다. 아마도 그의 구현은 약간 glib.

AUTO INCREMENTING INTEGER "ID"열과 문자열/varchar "OldGUID"가있는 테이블을 만드는 것이 어떻습니까? 모든 기존/현재 GUID를 테이블에 INSERT하면 GUID와 더 짧거나 압축 된 "ID"가 일대일로 일치합니다. 새 GUID를 만들 때 테이블에 INSERT하면 1 대 1 매치가 계속되므로 길고 짧은 버전간에 앞뒤로 전환 할 수 있습니다.

0

유일한 식별자가 필요한 경우 가장 먼저 생각한 것은 UUID입니다.

그러나 일반 UUID는 16 바이트를 사용하며 이진 형식입니다. 6자를 요구하지 않습니다. 32 문자를 사용하는 현재 방법과 비교하여 "만"50 % 공간을 절약합니다.

따라서 일반적인 해시 기능과 함께 64 비트 UID (8 바이트)를 사용하는 것이 좋습니다. 좋은 해시를 사용하면 생성 된 UID의 총 수가 < 100 million 미만인 경우 충돌 가능성이 상당히 합리적입니다. 허용되는 것으로 보인다면 8 바이트가 공간 요구 사항에 매우 가깝게 보입니다.