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