【问题标题】:How to make an unique id for an object that is not random如何为非随机对象创建唯一 ID
【发布时间】:2019-01-27 21:23:41
【问题描述】:

问题

我需要为每个 Person 对象创建一个唯一的 id

public interface Person 
{
    String getName();
}

public class Chef implements Person
{
    String name;
    ....
    // all other instance variables are not unique to this object.
}
public class Waiter implements Person
{
    String name;
    ....
    // all other instance variables are not unique to this object.
}

额外信息

Chef 中的所有其他实例变量都不是特定的Chef 所独有的。我们也不能在Chef 类中添加任何额外的变量以使其唯一。这是因为此信息来自后端服务器,我无法修改 Chef 类。 这是一个分布式系统。

我想做什么

我想创建一个整数来映射这个Person 对象。我试图创建一个“独特的”id

private int makeId(Person person)
{
    int id = person.getName()
        .concat(person.getClass().getSimpleName())
        .hashCode();

    return id;
}

但是,我知道这并不是真正唯一的,因为名称的 hashCode 不能保证任何唯一性。

如果不使用 random 我可以使 id 唯一吗?

对于造成的误解,我深表歉意,但我无法向我的 ChefWaiter 对象类添加更多字段,并且应用程序已分发

【问题讨论】:

  • 比什么更独特?你不能让它比你在 id-making 过程中投入的更独特——在你的情况下,这就是人的名字——所以两个同名的人总是会产生相同的 id,无论你如何调整过程(如果您希望它对于相同的输入可重现;否则您将进入随机性)
  • 可能,你只需要UUID?
  • 这可能是 x/y 问题。您实际上需要 id 做什么?您无法在不使用某种随机性的情况下生成从一个字段生成的唯一 ID。您能在这里提供更多背景信息吗?
  • 请将要求添加到您的问题中。 HashMap 的键值对象是什么?
  • @J_Strauton 请在您的问题中添加更详细的分布式系统描述。还要添加关于您希望如何在分布式系统中使用此 ID 的描述。这个 ID 必须是整数还是可以是字符串或 UUID 之类的其他东西? ID的计算/生成是否需要依赖Person对象的字段,还是可以独立生成/分配?

标签: java unique-id


【解决方案1】:

如果您的应用程序不是分布式的,只需在构建过程中使用静态计数器:

public class Chef {

    private static int nextId = 1;

    private final String name;
    private final int id;

    public Chef(String name){
        this.name = name;
        this.id = Chef.nextId++;
    }
}

第一个 Chef 的 id 为 1,第二个为 2,依此类推。

如果您的程序是多线程的,请使用AtomicInteger 代替nextId,而不是普通的int

只是不要使用hashCode 作为唯一ID。哈希码根据定义不必是唯一的。

【讨论】:

  • 这不是我的问题。添加新 ID 不是我的问题的一部分。我的应用程序是分布式的。
  • 那我建议你改写问题并添加所有相关信息
  • 如果你修改问题来提供答案,那真的是在回答问题吗?
【解决方案2】:

添加一个全局唯一标识符 (GUID) 怎么样?

GUID 是一个 128 位整数(16 个字节),可以在需要唯一标识符的所有计算机和网络中使用。这样的标识符被复制的概率非常低。

在 Java 中,它被称为UUID。例如:

UUID uuid = java.util.UUID.randomUUID();

System.out.println(uuid.toString());

【讨论】:

    猜你喜欢
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多