1

我有一堂课(下)。我有班级的字段ID,但我不知道如何使它创建一个按顺序增加的唯一ID。

我发现 UUID.randomUUID(); 会生成一个唯一的 ID,但会以非常不友好的方式生成,并且无法限制大小。

当从下面的类创建对象时,我如何实现一些东西来增加 id 字段?

class Customer {

public int id;
public String name;
public String email;
public String number;
public String issue;
public String expiry;

Customer(String eName, String eEmail, String eNumber, String eIssue, String eExpiry)
{
    id = 0935091285;
    name = eName;
    email = eEmail;
    number = eNumber;
    issue = eIssue;
    expiry = eExpiry;
}
}
4

2 回答 2

4

您没有指定是否有多个进程同时生成 id。如果您不这样做,则以下内容很简单并且会很好地工作:

public class Customer {
  private static AtomicInteger nextId = new AtomicInteger(0);
  private static String getNextId() {
    return Integer.toString(nextId.incrementAndGet());
  }
  public Customer(...) {
    id = getNextId();
    ...
  }
}

如果您希望 id 的字典顺序以反映对象创建顺序,请使用前导零格式化数字 id。

于 2012-11-26T18:19:38.337 回答
1

我不确定我是否理解为什么 UUID 生成器不能满足您的需求。大小是固定的(36 个字符)。我可以理解非顺序部分可能是一个问题。

如果您需要按顺序生成唯一标识符(并且鉴于您已经尝试过 UUID,我想您已经尝试过简单的增量系统)并且可能大规模生成,我建议您看一下snowflake,使用的服务通过 twitter 生成顺序但非增量的 id。

基本上,它是一个可以运行的简单服务器,它会在您需要时为您生成唯一标识符:

  • 用 Scala 编写的 Thrift 服务器
  • id 由以下部分组成:

    • 时间 - 41 位(毫秒精度/自定义纪元给我们 69 年)
    • 配置的机器 id - 10 位 - 给我们最多 1024 台机器
    • 序列号 - 12 位 - 每台机器每 4096 次翻转一次(具有保护以避免在同一毫秒内翻转)

资源:

于 2012-11-26T18:19:42.537 回答