我正在使用当前日期和时间生成唯一的文件夹名称。是否有可能发生冲突的场景?我认为不是,因为,直到毫秒,没有两个日期可以相同(除非两个上传发生在同一毫秒 - 但这在我目前的情况下不太可能。)
(Time.now.to_f * 1000).to_i
答案 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)
你可以完全避免这个问题,只需要额外付出一点点,所以为什么不马上做呢?
我可以看到两种解决方案:
retry
语句可能是这种情况的完美匹配。)