2010-03-28 84 views
1

我想每次调用methode generateCustumerId()时生成唯一的ID。生成的ID必须是8个字符或少于8个字符。 这个要求是必要的,因为我需要将它存储在数据文件中,并且架构被确定为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; 
} 

}

1选项生成一个唯一的ID是太长

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; 
    } 

} 

根据你允许你在uuid中的字符,这可以做各种方法。我会读取当前字符串的最后一个字符,检查它是否是最后一个允许的字符。是的,增加第七个字符等等。否则,增加最后一个字符。

1

不是世界上最好的解决办法,但如何斩波uuid的长度?它不会是全球唯一的 - 只需注意您不会获得全球唯一的标识符 - 但它可能适用于本地独特。

+0

如果你砍,你将永远有一个机会,该ID是不是唯一的 – loudiyimo 2010-03-28 16:45:59

+0

任何时候你限制自己8个字符 - 有一个机会,你将不再是唯一的。事实上,GUID有可能不是唯一的 - “两次产生相同数字的概率非常小” - 但不是无。 – 2010-03-29 14:32:33

2

也许Commons Id project有一定用处。 alphanumeric generator(以及它们的其他生成器)需要一个长度参数。当然,这实际上只是支持一个序列(这意味着您必须知道/确定应用程序重新启动时最后一个最高标识符)。

或者,您可能会尝试类似本地时间的CRC-32校验和或随机生成的字节数组(CRC32为built into the Java Standard Library)。

1

保持一个永久计数器,每次请求一个新的ID时递增1。

如果数据文件是一个SQL表,你总是可以选择MAX(id)+ 1,并且使用它,但是你需要绝对确定当你需要两个id时,你不会遇到多任务问题时间(并且它们都与MAX(id)具有相同的值)。请注意,大多数数据库都有一个为此目的而设计的本地数据类型,对于任何非平凡的程序,您应该使用该工具。