java中的唯一ID生成

时间:2012-08-24 12:41:52

标签: java

给一个输入字符串,字符串长度不超过30,输出将是唯一的id号。 Java中有没有办法可以做到这一点?相同的字符串将始终生成相同的id,不同的字符串不能生成相同的id。 java HashCode()可以做到这一点吗?

感谢

5 个答案:

答案 0 :(得分:3)

满足要求

  

相同的字符串将始终生成相同的id,不同的字符串不能生成相同的id

你会得到相当多的数字。您需要该函数为injective,因此您需要的数字与可能String的数量一样多,在您的情况下类似于$ 255 ^ 30 $(或类似$ 65536 ^ 30 $你允许任意Unicode字符)。因此,您需要BigInteger,而且肯定会使用int(只有String的长度最多为int,而new BigInteger(theString.getBytes(""))中的数字最多为30。例如,hashCode符合您的要求。

如果您使用String,则会失去注意力,但在大多数情况下,两个hashCode具有相同{{1}}的可能性非常低(实际上是hashing让这个机会变低。如果你想确定碰撞的数量一致,你可以使用一些cryptographic hash function,但是,映射不会是单射的。

或许解释您的要求的原因将有助于找到最佳解决方案。

答案 1 :(得分:1)

不保证Java哈希码是唯一的。你需要研究UUID。

public static UUID nameUUIDFromBytes(byte[] name)

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/UUID.html

答案 2 :(得分:0)

也许这有点傻,但如何将每个字符转换为ASCII数字呢?

答案 3 :(得分:0)

如果你确实需要确定没有碰撞,那么你获得的数字将是巨大的,肯定比任何原始数字类型都大。我的建议是使用几乎肯定足够好的SHA-1哈希(Git版本控制系统依赖于这些哈希值的唯一性,你的要求是否真的比他们的要严格?)

如果你想保证唯一性,那么我想你可以做的一种方法是为每个字符取ASCII(或Unicode,取决于你的输入)数值,用零填充它,使所有值都相同长度,然后将它们连接成一个大数字。如前所述,您无法将其设置为long值,因此您需要使用BigInteger类。填充是必要的,以避免碰撞,如'12 + 34'和'123 + 4'。

答案 4 :(得分:0)

除非您能够以确定的方式限制有效字符串集,否则您唯一的选择是将整个字符串解释为您的ID。当你要获得非常大的id时,你应该使用BigInteger类来表示它们。

我会以相反的顺序转换字符,以免不必担心不同长度的字符串。