1

是否可以配置 couchdb 以生成 UUID 以外的 id 方式?我在单个节点上使用 couchdb,我了解不将 UUID 用于分布式环境的缺点。

我需要像自动增量或更短的 id 之类的东西。我有像 userIds 这样的 FK 引用:["16011a5704ffe78e6de2afa4b3001d10", "55464a5704ffe78e6de2afa4b3001d10", ... ] 如果我使用 UUIDS 可能会太长..

4

2 回答 2

2

您可以自己提供您的 ID,即使生成的 UUID 也不能保证无冲突,它只是最大限度地减少冲突的机会,但由于您担心长度,我们可以将其缩短为 16。前 4 确定用户,接下来 8确定时间戳,最后 4 个可以是随机的。使用这个多基转换器,您可以使用 char 范围0-9a-zA-Z

  1. 一旦新用户使用该系统,他将被分配一个由 4 个字符组成的唯一字母数字(超过 1400 万个可能的前缀)
  2. 接下来,我们以毫秒为单位获取当前时间,并使用上面提供的多基转换器对其进行转换(应该可以工作到 8888 年)
  3. 最后的 4 个字符将是一个随机生成的字符串,只是为了填充。

打破这一点将非常困难。根据您正在构建的系统类型和您正在考虑的最大用户数,您可以将其减少到 10 个(3 个前缀,7 次),甚至可以(-_)在您的字符列表中添加更多字符。


编辑 这是我自己的实现在我的解决方案中,每个用户一旦被管理员添加,就已经有一个唯一的前缀,并且管理员创建的用户不超过 10 个。根据创建的数据类型,使用唯一字符作为前缀。然后这是我转换当前时基62的方法。最后,我附加了一个随机字符。`

base62 (val) {
  const SYMBOLS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  let digs = ''
  while (val) {
    digs = SYMBOLS.charAt(val % SYMBOLS.length) + digs
    val /= SYMBOLS.length
    val = parseInt(val)
  }
  return digs
}

单个用户不能一次在同一类别下创建两条记录,即使他这样做了,也很少会生成相同的随机附加字符。

于 2018-04-03T20:31:56.540 回答
0

使用 UUID 而不是简单的自动增量值的原因是为了减少使用多个节点时发生冲突的可能性。CouchDB 确实有3 种不同的算法可供您选择来生成 UUID。

如果您需要其他 id 格式,您始终可以定义自己的字段,因为 uuid 生成器仅在未定义_id时才被调用。_id

于 2013-08-08T20:26:28.383 回答