为什么timeuuid没有任何碰撞?

时间:2016-11-03 21:22:04

标签: cassandra

我正在阅读the Datastax CQL reference

  

可能会覆盖非预期数据的冲突   被覆盖不会发生。

有人可以向我解释为什么永远不会发生碰撞吗?这是不可能的还是"高度"不可能?

2 个答案:

答案 0 :(得分:5)

Cassandra的timeuuid是Version 1 UUID,它基于生成UUID的机器的时间和MAC地址。

使用的时间精确到100ns,因此碰撞的可能性非常小(纳秒是百万分之一毫秒)。

答案 1 :(得分:2)

Cassandra timeuuid是版本1 UUID(Type 1 UUID),它基于:

  1. 一个时间戳,由100纳秒间隔组成 1582年10月15日(格里高利改革基督徒的日期) 日历)。
  2. 版本(值应为1)。
  3. 变体(值应为2)。
  4. 序列号,可以是计数器或伪随机数。
  5. A"节点"这将是机器的MAC地址(应该使UUID在机器之间是唯一的)。
  6. 对序列号使用伪随机数可提供16,384个机会中的1,即每个UUID类具有唯一ID。

    如果每毫秒生成超过10000 UUID,则它们可能会发生冲突。

    1毫秒= 10 ^ 6 ns

    如果我们采用ns级时间戳,你可以生成10 ^ 6 UUID 因为我们把时间戳记作为100ns计数。

    我们将在一毫秒内拥有最多10000个唯一时间戳。

    现在在一台机器上产生的数量超过一台(具有相同的MAC地址),有可能发生碰撞,我们还需要考虑序列号。

    如果您的应用程序每毫秒产生的次数超过10000,请使用另一列制作复合键,以避免冲突。