每次调用methode generateCustumerId()时,我想生成唯一的id。生成的id必须长度为8个字符或少于8个字符。 此要求是必需的,因为我需要将其存储在数据文件中,并且该ID确定为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;
}
}
option2会生成一个太长的唯一ID
public static String generateCustumerId() {
String ownerId = UUID.randomUUID().toString();
System.out.println("ownerId " + ownerId);
return ownerId
}
答案 0 :(得分:2)
也许Commons Id project有一些用处。 alphanumeric generator(以及它们的其他生成器)采用长度参数。当然,这实际上只支持一个序列(这意味着你必须知道/确定应用程序重启时的最后一个最高标识符)。
或者,您可以尝试类似本地时间的CRC-32校验和或随机生成的字节数组(CRC32为built into the Java Standard Library)。
答案 1 :(得分:1)
这不是世界上最好的解决方案,但如何将uuid切割成长度?它不会是全球唯一的 - 只要知道你不会得到一个全球唯一的标识符 - 但它可能适用于本地唯一。
答案 2 :(得分: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;
}
}
根据您允许的字符,这可以通过各种方式完成。我会读取当前String的最后一个字符,检查它是否是最后允许的字符。是这样,增加第7个字符,依此类推。否则,递增最后一个字符。
答案 3 :(得分:1)
保留一个持久计数器,每当请求一个新ID时,该计数器会递增1。
如果数据文件是SQL表,你总是可以选择MAX(id)+ 1,然后使用它,但你需要绝对确定当同时需要两个id时你不会遇到多任务问题(它们都具有与MAX(id)相同的值)。请注意,大多数数据库都具有为此目的而设计的本机数据类型,对于您应该使用该工具的任何非平凡程序。