生成唯一ID

我需要为我的应用程序生成唯一的ID。 当我使用(UUID.randomUUID()).toString() ,我得到一个代码(认为这将是唯一的),这是非常冗长的。

当我们在Java Timestamp或randomstring的帮助下生成代码时,我不确定它有多独特。

我需要生成长度仅为8-10个字符的唯一代码(字母数字)。 怎么这样? 我正在使用MySQL数据库。

在数据库端生成唯一代码是最好的方法还是我们可以在Java中生成这样的短(但唯一)代码?

任何带有示例代码的建议都会非常有用。

我使用commons-lang RandomStringUtils.randomAlphanumeric()方法来实现这个目的:

 import org.apache.commons.lang.RandomStringUtils; public static final int ID_LENGTH = 10; public String generateUniqueId() { return RandomStringUtils.randomAlphanumeric(ID_LENGTH); } 

如果您使用Maven,请确保已将commons-lang添加到项目的依赖项:

  commons-lang commons-lang 2.6  

在数据库端生成唯一代码是最好的方法还是我们可以在java中生成这样的短(但唯一)代码?

这取决于您和您的项目。 id生成是业务逻辑的一部分吗? 如果是,所有逻辑都写在Java上,那么就把它写在Java上。 如果逻辑的全部或部分委托给数据库,那么在那里生成id(但在这种情况下,您将对特定数据库具有强依赖性)。

您是否有任何需要考虑的具体限制? 如跨应用的独特性? 因为否则,MySQL完全能够自己生成ID,你需要做的就是定义一个autoincrement列,而不是在插入时指定它(意味着,为它插入一个NULL值) – 这将使MySQL填充下一个可用的ID,独一无二,无需您的工作。

它不是字母数字字符串(我不确定你是否指定了要求或限制),但如果你需要的只是唯一性,那就足够了。 8-10个字母数字字符不足以保证随机生成的字符串的唯一性,因此您必须对数据库执行插入检查。

在数据库端生成唯一代码是最好的方法还是我们可以在Java中生成这样的短(但唯一)代码?

数据库旨在能够在需要时生成唯一ID。 我怀疑你(或我)可以编码的任何东西都是“更好”的变体。

我编写了一个简单的服务,可以生成半唯一的非连续64位长数字。 它可以部署在多台计算机上,以实现冗余和可扩展性。 它使用ZeroMQ进行消息传递。 有关其工作原理的更多信息,请参阅 github页面: zUID

看看: UIDGenerator.java

您可以自定义它(仅限处理或世界),它易于使用且快速:

  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

或者自己运行它们。

如果id生成部分在数据库或java端完成的问题:这个问题必须由您根据应用程序的要求来回答:

1)一种方法是通过System.currenTimeMillis()。 但是,如果您的应用程序可以在多集群环境中使用,那么您可能会得到重复的值。

http://www2.sys-con.com/itsg/virtualcd/java/archives/0512/Westra/index.html

2)另一种方法是使用UUID Generator。如果您有不同的数据库需要合并,它将帮助您。 使用这个mehtod,您不必担心在合并数据库时重复id。

https://marketplace.informatica.com/solutions/mapping_uuid_using_java

您可能还需要考虑其他因素。 根据你的问题UUID方法将去。