Java 顺序 UUID

标签 java sql uuid

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

2年前关闭。




Improve this question




我需要将 UUID 用于我的一些表的主键,因为它们需要在多个客户端数据库中是全局唯一的,并且某些数据需要在某个时候合并回来。

使用 VARCHAR(36) 列和 java 的第 4 版 UUID 随机生成器解决了这个问题,但它的问题是 UUID 不是连续的,所以这会给索引和插入带来另一个问题,特别是在一些大表上(1+ 百万行)。

我正在尝试通过将 UUID 中的最高有效位替换为当前时间戳(无论如何这些位已经代表时间戳)来生成顺序但随机的 UUID。我知道网络上有解决方案可以做到这一点,即 COMB UUID,但奇怪的是我找不到它的 Java 实现。我认为这将是一个普遍的问题。

我在这里找到了一个关于 C# 的有趣实现:
http://www.codeproject.com/Articles/388157/GUIDs-as-fast-primary-keys-under-multiple-database

类似的方法可以满足我的需要,但是我很难将其转换为 Java,因此如果有人可以帮助我,我将不胜感激。我认为大多数问题都与大端/小端有关,因为我认为 Java 将始终使用大端,而不是来自 native 操作系统的大端?不太清楚如何处理这个问题。

我的想法基本上是一样的,使用 UUID.randomUUID() 生成一个 UUID,然后用 System.currentTimeMillis() 替换生成的 id 中的 MSB。我不确定的一件事是我需要的字节数,因为我认为我们可以用 6 个字节表示当前时间戳,但 UUID 的时间戳部分使用 7.5 个字节:

time_low               = 4*<hexOctet>
time_mid               = 2*<hexOctet>
time_high_and_version  = 2*<hexOctet> (1 byte for UUI algorithm version)

编辑:到目前为止,我很欣赏这些答案,但请理解我的问题是关于在 Java 上实现上述算法,而不是为此找到另一种选择。我知道还有其他几种可能性,其中提到的包含客户端标识符的一种是我过去使用过的,但我不太喜欢那个解决方案,它不适用于这个项目主要是因为两件事:
- 当客户数量已知时,这可能会很好,但情况并非如此,这意味着我需要为每个客户生成随机 id 以使其尽可能唯一,这意味着客户 id 前缀有 36 个字符和顺序部分还有很多,这意味着 50 多个字符的主键不是一个好主意。
- 这不会解决我要解决的问题,即具有顺序主键,一旦您开始将来自不同客户端的记录插入同一个表中,插入不再是顺序的,并且您将受到性能影响。

最佳答案

你可能想多了。

你似乎有两个要求

  • 全局唯一(在您的数据库中)ID。
  • 每个数据库中按顺序生成的 ID。

  • 我建议您为每个数据库分配一个唯一标识符,然后附加一个按顺序生成的值来获取您的标识符。

    例如,如果我有两个数据库 A 和 B:
  • A 按以下顺序生成标识符:A-1、A-2、A-3 等。
  • B 按以下顺序生成标识符:B-1、B-2、B-3 等。

  • 标识符是全局唯一且连续的。

    我实际上会将这个标识符实现为两列,一列用于 DB 标识符(例如,A 或 B),第二列用于序列号(存储为整数类型)。

    您甚至可以延迟数据库标识符的创建,直到您实际上必须在两个数据库之间合并行。

    关于Java 顺序 UUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36235001/

    相关文章:

    java - 将 AdapterView 与抽屉导航结合起来

    java - JPA查询问题

    c# - Linq to SQL 删除/添加子对象

    mysql基于2列的连接

    ios - 蓝牙 HM-10 PIN 连接,身份验证/安全

    java - 使用 Gson 生成带有信封/ header 的 JSON 文档

    java - 如何使用抽象类将 JSON 数据数组反序列化为 POJO?

    html - 使用 HTML 将数据插入 SQL 服务器表

    java - 使用 JPA 在 PostgreSQL 中持久化 UUID

    sql - 存储人类可读的 UUID 的最小方法是什么?