生成唯一标识符

18

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

我不确定当我们使用Java Timestamp或randomstring生成代码时,它会有多独特。

我需要生成仅为8-10个字符长度(字母数字组合)的唯一代码。 如何实现? 我正在使用MySQL数据库。

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

任何带有示例代码的建议将非常有帮助。


你想创建自己的方法来使用时间戳生成唯一的ID吗? - Hemant Metalia
你可以获得一个唯一的数字,然后在将记录存入数据库时每次将其增加1。 - Ved
2
@Sathish:为什么不根据所需的长度获取子字符串,并不断检查新字符串是否等于任何先前分配的字符串。UUID是最好的方法 :-) 问候 - nIcE cOw
@Hemant Metalia:我不介意创建一个按时间戳生成代码的新方法,但我的问题是,它会是唯一的吗? - user915303
@Gagandeep Bali:我觉得使用substring()函数并将其与先前的值进行比较(将有许多ID)会花费很长时间...这将导致性能问题!!! - user915303
6个回答

22
我使用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()函数,我们可以按照所需的长度获取代码...但是这些代码是唯一的吗? - user915303
1
randomAlphanumeric()生成随机字符的字符串,大多数情况下是唯一的(您也可以尝试在循环中运行它并生成新字符串,直到它不存在为止)。 - Slava Semushin
谢谢!最后我使用了RandomStringUtils.randomAlphanumeric(10)来生成代码,并检查数据库中的代码是否存在。如果不存在,我会将其用作我的唯一代码。 - user915303

7
你是否有任何需要考虑的特定限制?例如跨应用程序唯一性?否则,MySQL 可以很好地自动生成 ID,你只需要定义一个 autoincrement 列并在插入时不指定它(即插入一个 NULL 值),这将使 MySQL 自动填充下一个可用的唯一 ID,无需额外操作。
它生成的不是字母数字字符串(我不确定你是否将其指定为要求或限制),但如果你只需要唯一性,那就足够了。8-10 个字母数字字符不足以保证在随机生成的字符串中唯一,因此你需要在数据库中执行插入检查。

5

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

数据库旨在能够在需要时生成唯一的ID。我怀疑你(或我)编写的任何代码都不可能比它更好。


谢谢。如果可以的话,您能给我一些如何为MySQL数据库生成唯一ID的示例吗? - user915303

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

0

看一下: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生成器,它在多集群Java应用程序中是否唯一?即使服务器重新启动,那个ID也会是唯一的吗? - Shweta Gulati

0

关于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方法将会起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接