Java 具有正整数格式的自定义UUID字符串表示唯一性
我有以下方法来创建看起来像正长数的随机ID(由于非技术原因,我不能使用Java 具有正整数格式的自定义UUID字符串表示唯一性,java,uuid,Java,Uuid,我有以下方法来创建看起来像正长数的随机ID(由于非技术原因,我不能使用UUID.randomUUID().toString(),这超出了这个问题的范围): 问题很简单:这种方法会产生独特的结果吗?(我的意思是,像在UUID.randomUUID())中一样,Java支持整数的无符号tostringLong.toUnsignedString(Long)您还需要添加一个分隔符以确保它是唯一的。可能是因为您只是牺牲了128中的2位来获得正的Long`s。您可以使用wiki公式计算碰撞概率。你考虑过这篇
UUID.randomUUID().toString()
,这超出了这个问题的范围):
问题很简单:这种方法会产生独特的结果吗?(我的意思是,像在
UUID.randomUUID()
)中一样,Java支持整数的无符号tostringLong.toUnsignedString(Long)
您还需要添加一个分隔符以确保它是唯一的。可能是因为您只是牺牲了128中的2位来获得正的Long`s。您可以使用wiki公式计算碰撞概率。你考虑过这篇帖子吗?@vandench感谢你给我指出Long.toUnsignedString(Long)
,以及关于分隔符的。。。实际上这是我问题的核心。。。您认为用0
s左填充最低有效位会被视为有效的分隔符吗?填充会起作用,您只需要确保123+21
!=<代码>12+321。你可以使用一个定界符,每个长度使用16个十六进制字符,找到最大的长度值并计算数字和填充,只要你能确定哪个数字是哪个,任何东西都可以工作。您甚至可以假设在Base64中将其表示为128位整数Long.toUnsignedString(Long)
您还需要添加一个分隔符以确保它是唯一的。可能是因为您只是牺牲了128中的2位来获得正的Long`s。您可以使用wiki公式计算碰撞概率。你考虑过这篇帖子吗?@vandench感谢你给我指出Long.toUnsignedString(Long)
,以及关于分隔符的。。。实际上这是我问题的核心。。。您认为用0
s左填充最低有效位会被视为有效的分隔符吗?填充会起作用,您只需要确保123+21
!=<代码>12+321。你可以使用一个定界符,每个长度使用16个十六进制字符,找到最大的长度值并计算数字和填充,只要你能确定哪个数字是哪个,任何东西都可以工作。您甚至可以假设它在Base64中表示为128位整数。
public String createRandomId() {
UUID uuid = UUID.randomUUID();
return String.valueOf(uuid.getMostSignificantBits() & Long.MAX_VALUE) +
(uuid.getLeastSignificantBits() & Long.MAX_VALUE);
}