生成唯一 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的主要内容,如果未能解决你的问题,请参考以下文章

唯一ID生成算法剖析

如何生成唯一的Android设备ID

如何用redis来生成唯一Id

Redis-全局唯一ID

系统设计分布式唯一ID生成方案总结

PHP实现生成唯一id的雪花算法