Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中唯一ID的生成_Java - Fatal编程技术网

java中唯一ID的生成

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[

给定一个输入字符串,字符串长度将不超过30,输出将是唯一的id号。Java中有什么方法可以做到这一点吗?相同的字符串将始终生成相同的id,不同的字符串不能生成相同的id。Java哈希代码可以做到这一点吗


谢谢

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生成问题。