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

时间:2019-01-27 21:23:42

标签: java unique-id

问题

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

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不能保证任何唯一性。

如果不使用随机变量,我可以使此id唯一吗?

我对此误解表示歉意,但是我无法在ChefWaiter对象类中添加更多字段,并且应用已分发

2 个答案:

答案 0 :(得分:10)

如果您的应用程序未分发,则只需在构建过程中使用静态计数器即可:

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。哈希代码按照定义不一定是唯一的。

答案 1 :(得分:2)

如何添加全局唯一标识符(GUID)?

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

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

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

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