用于多平台应用程序的可排序UUID v1

问题描述 投票:3回答:1

我们正在寻找一种解决方案,为在Web,iOS和Android上的客户端之间交换的消息/信号生成唯一ID,然后保留在后端。

  • 解决方案必须标准化
  • 可在多个平台上使用
  • 按创建时间排序,可由数据库索引

UUID v1具有这些属性,除了排序和索引需要重新排列字符串标识符的一小部分。

UUID文档解释了时间块的顺序是相反的(从毫秒开始)(link)。

  UUID                   = time-low "-" time-mid "-"
                           time-high-and-version "-"
                           clock-seq-and-reserved
                           clock-seq-low "-" node
  time-low               = 4hexOctet
  time-mid               = 2hexOctet
  time-high-and-version  = 2hexOctet
  clock-seq-and-reserved = hexOctet
  clock-seq-low          = hexOctet
  node                   = 6hexOctet

由于UUID表示,我们不能简单地通过ID的字符串表示对ID进行排序,我们必须使用compare函数。

const toSortableUUID = uuidV1 =>
  uuidV1.replace(/^(.{8})-(.{4})-(.{4})/, '$3-$2-$1');

const uuidCompare = (uuidV1A, uuidV1B) => {
  if (uuidV1A === uuidV1B) {
    return 0;
  }
  const a = toSortableUUID(uuidV1A);
  const b = toSortableUUID(uuidV1B);
  return a < b ? -1 : 1;
};

const sortedArrayOfUUIDV1 = arrayOfUUIDV1.concat().sort(uuidCompare);

您是否知道另一种不会出现此问题的标准化方法?

使用UUID v1是否正确,但在重新安排的客户端之间进行交换,以便客户端可以按字符串表示排序,而不必每次都使用比较函数进行排序?

现场测试:https://codesandbox.io/s/q5oRxgnp

javascript uuid multiplatform timeuuid node-uuid
1个回答
2
投票

如果重新排列UUID的位,则不再具有UUID。

还要注意,UUID标准的目的之一是允许混合不同版本的UUID的值。换句话说,通常您不应该假设您的UUID完全是一个版本。

UUID从未打算被撕裂,永远不会被视为容器。聪明的程序员如果想要这样做,那就太聪明了。

然而,有些人确实改变了UUID的结构或内容。我不推荐。

相反,我建议您确定并区分您的疑虑。

  • 识别码 如果您需要跨时间和空间唯一地标识您的实体而不与集中式服务器协调,那么请使用适当的UUID。
  • 分类 如果您还想排序,则为排序值添加另一个字段。例如,如果要按时间顺序排序,请在数据库或数据接收器支持时存储时间戳值。如果不支持,请以标准ISO 8601格式存储UTC的日期时间值的文本表示。这种格式是明智地设计的,因此当按字母顺序排序时,它也是按时间顺序排列的。

2017-01-23t 01:23:45.123 g

© www.soinside.com 2019 - 2024. All rights reserved.