日期到毫秒始终是唯一的吗?

时间:2014-01-02 16:17:31

标签: ruby datetime unique

我正在使用当前日期和时间生成唯一的文件夹名称。是否有可能发生冲突的场景?我认为不是,因为,直到毫秒,没有两个日期可以相同(除非两个上传发生在同一毫秒 - 但这在我目前的情况下不太可能。)

(Time.now.to_f * 1000).to_i

5 个答案:

答案 0 :(得分:3)

您可能希望使用the tmpdir standard library中的Dir.mktmpdir。它将处理一个真正独特且无冲突的目录名,它将系统时间和进程ID考虑在内。

答案 1 :(得分:1)

很好,但强制时间在过去的一毫秒之后得到至少 1 (在某些情况下 2 )只有当你将它乘以1000然后得到一个整数。

pp = (Time.now.to_f * 1000).to_i; sleep 0.001 ; ppp = (Time.now.to_f * 1000).to_i
# 1388680023598
# 1388680023599

当你乘以 10 ^ 6 时,你会得到另一个结果:

pp = (Time.now.to_f * 1000000).to_i; sleep 0.001 ; ppp = (Time.now.to_f * 1000000).to_i
# 1388681046148709
# 1388681046149988

此外,如果您希望获得唯一名称,可以使用UUIDs ruby​​版本的 GUID 。但是如果你需要创建唯一的临时文件夹,你应该使用ruby的方法创建一个临时文件夹,就像在前面的答案中所表达的那样。

答案 2 :(得分:1)

  

我认为不是,因为,直到毫秒,没有两个日期可以是相同的

你假设当你从系统时钟得到你有毫秒分辨率的时间。即使你得到了几毫秒,它意味着硬件具有1毫秒的分辨率。

对于大多数现代计算机和操作系统,它更接近 10 毫秒。如果您预计会有大量的呼叫,您当然可以将几毫秒的时间读取在一起,并且可以获得相同的时间戳。

你最好附加一个自动递增的整数,或一些随机数或guid。如果您想要一些可排序性,可以添加一个timetamp 另一个数字。

此外,您应该记住,用户可以随时调整时钟,或者如果系统通过NTP同步,它可能会自行更改。

答案 3 :(得分:1)

计算机通常会定期更新时钟以纠正漂移。

时钟很可能会及时跳回来,然后再获得相同值的两倍。

不要将时间用于唯一值

答案 4 :(得分:0)

你可以完全避免这个问题,只需要额外付出一点点,所以为什么不马上做呢?

我可以看到两种解决方案:

  1. 使用连续数字命名目录。在创建它时,您需要列出现有目录,找到编号最大的目录,并尝试使用此编号+ 1创建目录。如果出现竞争条件,可能失败,这就是您的原因应该重试它(Ruby的retry语句可能是这种情况的完美匹配。)
  2. 使用UUID命名目录。同样,您也可能遇到冲突,因此如果目录已经存在,则需要重试您的尝试。