2010-03-28 2 views
1

나는 methode generateCustumerId()를 호출 할 때마다 고유 ID를 생성하려고합니다. 생성 된 ID는 8 자 또는 8 자 미만이어야합니다. 이 요구 사항은 데이터 파일에 저장해야하며 스키마는이 ID에 대해 8 자 길이로 결정되므로 필요합니다.8 자 미만의 고유 한 숫자를 생성하는 방법

옵션 1은 정상적으로 작동합니다. 옵션 1 대신 UUID를 사용하려고합니다. 문제는 UUID가 많은 문자를 가진 id를 생성한다는 것입니다. 누군가 99999999보다 작은 고유 ID를 생성하는 방법을 알고 있습니까?

옵션 1

import java.util.HashSet; 
import java.util.Random; 
import java.util.Set; 

public class CustomerIdGenerator { 

private static Set<String> customerIds = new HashSet<String>(); 
private static Random random = new Random(); 

// XXX: replace with java.util.UUID 
public static String generateCustumerId() { 

    String customerId = null; 
    while (customerId == null || customerIds.contains(customerId)) { 
     customerId = String.valueOf(random.nextInt(89999999) + 10000000); 
    } 
    customerIds.add(customerId); 
    return customerId; 
} 

}

옵션 2는 벌목에 대한

public static String generateCustumerId() { 
    String ownerId = UUID.randomUUID().toString(); 
    System.out.println("ownerId " + ownerId); 
    return ownerId 
} 

답변

1

고유하거나 랜덤해야합니까? 고유해야 할 경우에만 응용 프로그램을 시작할 때 데이터 저장소에서 가장 높은 값을로드 할 수 있습니다 (하나의 응용 프로그램 만 데이터 파일에 쓰는 경우). 당신은 당신의 가장 높은 가치를 지니고 있습니다 :

public class IdGenerator{ 
    private String value; 

    public IdGenerator(String initial value){ 
    this.value = value; 
    } 

    public synchronized String nextValue(){ 
    value = incrementValue(value); 
    return value; 
    } 

    private static String nextValue(String currentValue){ 
    // Somehow increment the value. 
    return incrementedValue; 
    } 

} 

여러분이 허용하는 문자에 따라 이것은 다양한 방법으로 할 수 있습니다. 현재 문자열의 마지막 문자를 읽었을 때 마지막으로 허용 된 문자인지 확인합니다. 그래, 7 번째 문자를 증가시킨다. 그렇지 않으면 마지막 문자를 증가시킵니다.

1

최고는 아니 세계에서 솔루션,하지만 어떻게 너무 긴 고유 ID를 생성 길이에 대한 uuid? 전 세계적으로 유일한 것은 아니며, 전 세계적으로 고유 한 식별자를 얻지는 못할 것이라는 점에 유의하십시오. 그러나 지역적으로 고유 할 수도 있습니다.

+0

자르면 언제든지 ID가 고유하지 않을 가능성이 더 높습니다. – loudiyimo

+0

언제든지 자신을 8 자로 제한 할 수 있습니다. 더 이상 고유하지 않게 될 가능성이 있습니다. 실제로 GUID가 고유하지 않은 경우가 있습니다. "동일한 숫자가 두 번 생성 될 확률은 극히 적습니다"-하지만 그럴 가능성은 없습니다. –

2

아마도 Commons Id project 일 것입니다. alphanumeric generator (및 기타 다른 생성자도) 길이 인수를 취합니다. 물론, 이것은 단지 시퀀스를 지원합니다 (이것은 응용 프로그램 재시작시 마지막으로 가장 높은 식별자를 알아야하거나 결정해야 함을 의미합니다).

또는 localtime의 CRC-32 체크섬이나 임의로 생성 된 바이트 배열 (CRC32는 built into the Java Standard Library)을 시도해 볼 수 있습니다.

1

새 ID를 요청할 때마다 1 씩 증가하는 영구 카운터를 유지하십시오.

데이터 파일이 SQL 테이블 인 경우 MAX (id) + 1을 항상 선택하여 사용할 수 있지만 동일한 ID에서 두 개의 ID가 필요할 때 멀티 태스킹 문제에 부딪치지 않아야합니다. (둘 다 MAX (id)에서 동일한 값을 가짐). 대부분의 데이터베이스는 이러한 목적으로 설계된 원시 데이터 유형을 가지고 있으며 중요한 프로그램이 아닌 경우 해당 기능을 사용해야합니다.

관련 문제