1

每次我调用方法 generateCustumerId() 时,我都想生成唯一的 ID。生成的 id 长度必须为 8 个字符或少于 8 个字符。这个要求是必要的,因为我需要将它存储在一个数据文件中,并且这个 id 的模式被确定为 8 个字符长。

选项 1 工作正常。我想使用 UUID 而不是选项 1。问题是 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

4 回答 4

2

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

或者,您可以尝试本地时间的 CRC-32 校验和或随机生成的字节数组(CRC32内置在 Java 标准库中)。

于 2010-03-28T17:24:58.023 回答
1

不是世界上最好的解决方案,但是如何将 uuid 切成长度?它不会是全球唯一的 - 请注意您不会获得全球唯一的标识符 - 但它可能适用于本地唯一。

于 2010-03-28T16:22:33.783 回答
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 中的字符,可以通过多种方式完成。我会读取当前字符串的最后一个字符,检查它是否是最后一个允许的字符。是这样,增加第 7 个字符,依此类推。否则,增加最后一个字符。

于 2010-03-29T03:13:52.630 回答
1

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

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

于 2010-03-29T05:39:02.157 回答