如何为非随机对象创建唯一 ID

How to make an unique id for an object that is not random

问题

我需要为每个 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 class 中添加任何额外的变量来使其唯一。这是因为此信息来自后端服务器,我无法修改 Chef class。 这是分布式系统。

我想做什么

我想创建一个整数来映射这个 Person 对象。我试图创建一个 "unique" id

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

    return id;
}

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

不使用随机我可以使这个 id 独一无二吗?

我为误会表示歉意,但我无法向我的 ChefWaiter 对象 class 和 [= 添加更多字段42=]申请已分发.

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

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

在Java中称为UUID。例如:

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

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

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

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等等

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

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