java中唯一ID的生成
给定一个输入字符串,字符串长度将不超过30,输出将是唯一的id号。Java中有什么方法可以做到这一点吗?相同的字符串将始终生成相同的id,不同的字符串不能生成相同的id。Java哈希代码可以做到这一点吗java中唯一ID的生成,java,Java,给定一个输入字符串,字符串长度将不超过30,输出将是唯一的id号。Java中有什么方法可以做到这一点吗?相同的字符串将始终生成相同的id,不同的字符串不能生成相同的id。Java哈希代码可以做到这一点吗 谢谢Java哈希代码不保证是唯一的。你需要调查UUID public static UUID nameUUIDFromBytes(byte[] name) Java哈希代码不能保证是唯一的。你需要调查UUID public static UUID nameUUIDFromBytes(byte[
谢谢Java哈希代码不保证是唯一的。你需要调查UUID
public static UUID nameUUIDFromBytes(byte[] name)
Java哈希代码不能保证是唯一的。你需要调查UUID
public static UUID nameUUIDFromBytes(byte[] name)
也许这有点傻,但是把每个字符转换成ASCII数字怎么样?也许这有点傻,但是把每个字符转换成ASCII数字怎么样?如果你真的需要确保没有冲突,那么你得到的数字将是巨大的,肯定比任何原始数字类型都大。我的建议是使用SHA-1散列,这几乎肯定足够好Git版本控制系统依赖于这些散列值的唯一性,您的要求真的比他们的更严格吗
如果你想保证唯一性,那么我想一种方法是采用ASCII或Unicode,这取决于你为每个字符输入的数值,用零填充它,使所有值具有相同的长度,然后将它们连接在一起形成一个大数字。如前所述,无法将其放入长值中,因此需要使用BigInteger类。填充将是避免像“12+34”和“123+4”这样的冲突所必需的。如果您确实需要确保没有冲突,那么您得到的数字将是巨大的,肯定比任何基本数字类型都大。我的建议是使用SHA-1散列,这几乎肯定足够好Git版本控制系统依赖于这些散列值的唯一性,您的要求真的比他们的更严格吗
如果你想保证唯一性,那么我想一种方法是采用ASCII或Unicode,这取决于你为每个字符输入的数值,用零填充它,使所有值具有相同的长度,然后将它们连接在一起形成一个大数字。如前所述,无法将其放入长值中,因此需要使用BigInteger类。为了避免像“12+34”和“123+4”这样的冲突,填充是必要的。除非您能够以确定的方式限制有效字符串集,否则您唯一的选择是将整个字符串解释为您的id。由于您将获得非常大的id,您应该使用BigInteger类来表示它们
我将以相反的顺序转换字符,这样就不必担心长度不同的字符串。除非您能够以确定的方式限制有效字符串集,否则您唯一的选择是将整个字符串解释为您的id。由于您将获得非常大的id,您应该使用BigInteger类来表示它们
我会以相反的顺序转换字符,这样就不必担心长度不同的字符串。以满足要求 相同的字符串总是会生成相同的id,不同的字符串不能生成相同的id 你会得到相当大的数字。您需要函数为,因此您需要尽可能多的数字作为可能的字符串数,在您的情况下是$255^30$,如果您允许使用任意Unicode字符,则是$65536^30$。因此,您需要使用大整数来实现这一点,当然,您可以使用int,因为长度不超过30的字符串比int中的数字还要多。例如,新的BigIntegerTesting.getBytes可以满足您的要求 如果您使用hashCode,您将失去内射性,但是在大多数情况下,两个字符串具有相同hashCode的可能性非常低,这实际上是降低这种可能性的目的。如果您想额外确保碰撞的数量一致地小,您可以使用一些,但映射仍然不是内射的
也许解释您需求的原因有助于找到最佳解决方案。以满足需求 相同的字符串总是会生成相同的id,不同的字符串不能生成相同的id 你会得到相当大的数字。您需要函数为,因此您需要尽可能多的数字作为可能的字符串数,在您的情况下是$255^30$,如果您允许使用任意Unicode字符,则是$65536^30$。因此,您需要使用大整数来实现这一点,当然,您可以使用int,因为长度不超过30的字符串比int中的数字还要多。例如,新的BigIntegerTesting.getBytes可以满足您的要求 如果您使用hashCode,您将失去内射性,但是在大多数情况下,两个字符串具有相同hashCode的可能性非常低,这实际上是降低这种可能性的目的。如果你想额外确定碰撞的次数 rmly很小,可以使用一些,但是映射仍然不是内射的
也许解释您需求的原因有助于找到最佳解决方案。hashCode就是您想要的。或者自己对字符串应用加密哈希。哈希算法有冲突-尽管一些更好的算法相距非常远-因此使用这种算法感觉不太正确。显然,hashcode不是int=>只有2^32个可能值字符串是否仅限于某些字符?例如字母数字?@HotLicks'Unique'只有一个含义,而不是它。OP将需要一个数字0..2^240,除非输入具有受限字符集。hashCode是您想要的。或者自己对字符串应用加密哈希。哈希算法有冲突-尽管一些更好的算法相距非常远-因此使用这种算法感觉不太正确。显然,hashcode不是int=>只有2^32个可能值字符串是否仅限于某些字符?例如字母数字?@HotLicks'Unique'只有一个含义,而不是它。OP需要一个数字0..2^240,除非输入具有受限字符集。它是否总是为给定字符串返回相同的UUID?@srini.venigalla-True,但随机UUID每次都会给出不同的值-它与字符串无关。它是否总是为给定字符串返回相同的UUID?@srini.venigalla-True,但是一个随机UUID每次都会给出不同的值-它与字符串无关。例如,我想在我的系统中添加一个设备,我需要为设备的名称生成一个唯一的键,我将该键作为唯一ID存储在数据库中,并将其作为其他表的外键。当我删除系统中的设备时,我想将其添加回系统中,我将获得与以前完全相同的id。最安全的方法可能是使用设备名称作为密钥。或者,要创建一个字典表,将名称映射到键,并且从不删除其中的行,只需以这种方式插入即可,您只需以增量方式分配键。我假设删除不经常发生,所以这应该不是问题。也许我只是不删除记录,只是在记录上加上一些标志,这样我就不需要担心id生成问题。例如,我想在我的系统中添加一个设备,我需要为设备名生成一个唯一的密钥,我将该键作为唯一ID存储在数据库中,并将其视为其他表的外键。当我删除系统中的设备时,我想将其添加回系统中,我将获得与以前完全相同的id。最安全的方法可能是使用设备名称作为密钥。或者,要创建一个字典表,将名称映射到键,并且从不删除其中的行,只需以这种方式插入即可,您只需以增量方式分配键。我假设删除不经常发生,所以这应该不是问题。也许我只是不删除记录,只是在记录上加一些标记,这样我就不需要担心id生成问题。