如何为非随机对象创建唯一 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
独一无二吗?
我为误会表示歉意,但我无法向我的 Chef
或 Waiter
对象 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。根据定义哈希码不必是唯一的。
问题
我需要为每个 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
独一无二吗?
我为误会表示歉意,但我无法向我的 Chef
或 Waiter
对象 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。根据定义哈希码不必是唯一的。