如何生成长度小于8个字符的唯一数字

时间:2010-03-28 16:17:25

标签: java uuid unique-key

每次调用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
}

4 个答案:

答案 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)相同的值)。请注意,大多数数据库都具有为此目的而设计的本机数据类型,对于您应该使用该工具的任何非平凡程序。