生成唯一 ID
Posted
技术标签:
【中文标题】生成唯一 ID【英文标题】:Generate unique ID 【发布时间】:2012-02-22 01:03:11 【问题描述】:我需要为我的应用程序。当我使用(UUID.randomUUID()).toString()
时,我得到一个代码(认为这将是唯一的),这很长。
当我们在 Java Timestamp 或 randomstring 的帮助下生成代码时,我不确定它会有多独特。
我需要生成只有 8-10 个字符长度(字母数字)的唯一代码。怎么会这样? 我正在使用 mysql 数据库。
在数据库端生成唯一代码是最好的方法还是我们可以在 Java 中生成如此短(但唯一)的代码?
任何带有示例代码的建议都会非常有帮助。
【问题讨论】:
您想创建自己的方法来使用时间戳生成唯一 id 吗? 在将记录存入数据库时,您可以获取一个唯一的数字,然后每次加一。 @Sathish :为什么不根据您想要的长度获取 substring() 并继续检查新的是否等于任何先前分配的。 UUID 是最好的方法 :-) 问候 @Hemant Metalia:我不介意创建一种新方法来按时间戳生成代码,但我的问题是,它是否会是唯一的? @Gagandeep Bali:我觉得 substring() 并检查以前的值(会有很多 id)需要很长时间..会导致性能问题!!! 【参考方案1】:我使用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
添加到项目的依赖项中:
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
在数据库端生成唯一代码是最好的方法还是我们可以在 java 中生成如此短(但唯一)的代码?
这取决于您和您的项目。 id 生成是业务逻辑的一部分吗?如果是,并且所有逻辑都写在 Java 上,那么就写在 Java 上。如果将全部或部分逻辑委托给数据库,则在此处生成 id(但在这种情况下,您将对特定数据库有很强的依赖性)。
【讨论】:
嗨.. 非常感谢.. 通过使用 randomAlphanumeric(),我们可以按照我们希望的长度获取代码.. 但唯一吗??randomAlphanumeric()
生成带有随机字符的字符串,并且在大多数情况下它是唯一的(您也可以尝试循环运行它并生成新的,除非它不存在)。
谢谢.. 最后我使用了 RandomStringUtils.randomAlphanumeric(10) 来生成代码并检查数据库中是否存在代码。如果不存在,我将其用作我的唯一代码..【参考方案2】:
您是否有任何需要考虑的特定限制?比如跨应用唯一性?因为否则,MySQL 完全能够自己生成 ID,您需要做的就是定义一个 autoincrement
列,而不是在插入时指定它(意思是为其插入一个 NULL
值)——这将使 MySQL 填充它具有下一个可用的 ID,唯一且无需您进行任何操作。
它不会是一个字母数字字符串(我不确定您是否将其指定为要求或限制),但如果您只需要唯一性,那就绰绰有余了。 8 - 10 个字母数字字符不足以保证随机生成的字符串的唯一性,因此您必须对数据库执行插入检查。
【讨论】:
【参考方案3】:在数据库端生成唯一代码是最好的方法还是我们可以在 Java 中生成如此短(但唯一)的代码?
数据库旨在能够在需要时生成唯一 ID。我怀疑您(或我)可以编写的任何代码都会是“更好”的变体。
【讨论】:
谢谢。如果是这样,你能给我一些关于如何为 MySQL 数据库生成唯一 ID 的例子吗? 试试any of these。我不是每天都使用数据库,也从未使用过 MySQL。【参考方案4】:我编写了一个简单的服务,它可以生成半唯一的非连续 64 位长数字。它可以部署在多台机器上以实现冗余和可扩展性。它使用 ZeroMQ 进行消息传递。有关其工作原理的更多信息,请查看 github 页面:zUID
【讨论】:
【参考方案5】:看看: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
或自己运行它们。
【讨论】:
如果我使用 UID Generator,它在多集群 Java 应用程序中是否唯一,即使服务器重新启动,该 ID 是否唯一??【参考方案6】:id生成部分是在数据库还是java端完成的问题: 这个问题必须由您根据您的应用程序的要求来回答:
1) 一种方法是使用 System.currenTimeMillis() 。但是,如果您的应用程序将在多集群环境中工作,那么您最终可能会得到重复的值。
http://www2.sys-con.com/itsg/virtualcd/java/archives/0512/Westra/index.html
2) 另一种方法是使用 UUID 生成器。如果您有需要合并的不同数据库,它将为您提供帮助。使用此方法,您在合并数据库时不必担心 id 重复。
https://marketplace.informatica.com/solutions/mapping_uuid_using_java
您可能还需要考虑其他因素。 根据你的问题,UUID 方法会去。
【讨论】:
以上是关于生成唯一 ID的主要内容,如果未能解决你的问题,请参考以下文章