给一个输入字符串,字符串长度不超过30,输出将是唯一的id号。 Java中有没有办法可以做到这一点?相同的字符串将始终生成相同的id,不同的字符串不能生成相同的id。 java HashCode()可以做到这一点吗?
感谢
答案 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类来表示它们。
我会以相反的顺序转换字符,以免不必担心不同长度的字符串。