我需要为我的应用程序生成唯一的ID。当我使用(UUID.randomUUID()).toString()
时,我会得到一个代码(认为这将是唯一的),这是非常冗长的。
当我们在Java Timestamp或randomstring的帮助下生成代码时,我不确定它有多独特。
我需要生成唯一的代码,其长度仅为 8-10个字符(字母数字)。怎么这样? 我正在使用MySQL数据库。
在数据库端生成唯一代码是最好的方法,还是可以在Java中生成这么短(但是唯一)的代码?
任何带有示例代码的建议都会非常有用。
答案 0 :(得分:22)
我使用RandomStringUtils.randomAlphanumeric()
中的commons-lang
方法来实现此目的:
import org.apache.commons.lang.RandomStringUtils;
public static final int ID_LENGTH = 10;
public String generateUniqueId() {
return RandomStringUtils.randomAlphanumeric(ID_LENGTH);
}
如果您使用Maven,请确保已将commons-lang
添加到项目的依赖项中:
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
在数据库端生成唯一代码是最好的方法还是我们可以在java中生成这么短(但唯一)的代码?
取决于您和您的项目。 id生成是业务逻辑的一部分吗?如果是,所有逻辑都写在Java上,那么在Java上编写它。如果逻辑的全部或部分委托给数据库,那么在那里生成id(但在这种情况下,你将对特定数据库有很强的依赖性)。
答案 1 :(得分:7)
您是否有任何需要考虑的具体限制?如跨应用的独特性?因为否则,MySQL完全能够自己生成ID,您需要做的就是定义autoincrement
列,而不是在插入时指定它(意味着为其插入NULL
值) - 将使MySQL填充下一个可用的ID,唯一且不需要您的工作。
它不是一个字母数字字符串(我不确定你是否指定了要求或限制),但如果你需要的只是唯一性,那就足够了。 8-10个字母数字字符不足以保证随机生成的字符串的唯一性,因此您必须对数据库执行插入检查。
答案 2 :(得分:5)
在数据库端生成唯一代码是最好的方法,还是可以在Java中生成这么短(但是唯一)的代码?
数据库旨在能够在需要时生成唯一ID。我怀疑你(或我)可以编码的任何东西都是“更好”的变种。
答案 3 :(得分:1)
我编写了一个简单的服务,可以生成半唯一的非连续64位长数字。它可以部署在多台计算机上,以实现冗余和可扩展性。它使用ZeroMQ进行消息传递。有关其工作原理的更多信息,请参阅github页面:zUID
答案 4 :(得分:0)
您可以自定义它(仅限处理或世界),它易于使用且速度快:
private static final UIDGenerator SCA_GEN = new UIDGenerator(new ScalableSequence(0, 100));
.......
SCA_GEN.next();
您可以更改实施以减少ID的大小(并添加其他权衡)
请参阅我的基准测试结果:
http://zoltran.com/roller/zoltran/entry/generating_a_unique_id
或自己运行。
答案 5 :(得分:0)
如果在数据库或java端完成id生成部分的问题: 这个问题必须由您根据申请的要求来回答:
1)一种方法是通过System.currenTimeMillis()。但是,如果您的应用程序可以在多集群环境中运行,那么您最终可能会出现重复值。
http://www2.sys-con.com/itsg/virtualcd/java/archives/0512/Westra/index.html
2)另一种方法是使用UUID Generator。如果你有不同的数据库需要合并,它会帮助你。使用这个方法,你不必担心在合并数据库时重复id。
https://marketplace.informatica.com/solutions/mapping_uuid_using_java
您可能还需要考虑其他因素。 根据你的问题,UUID方法将会出现。