Ruby 毫秒的日期总是唯一的吗?

Ruby 毫秒的日期总是唯一的吗?,ruby,datetime,unique,Ruby,Datetime,Unique,我正在使用当前日期和时间生成唯一的文件夹名称。是否存在可能发生冲突的情况?我不这么认为,因为在毫秒以下,没有两个日期是相同的(除非两次上传发生在同一毫秒——但在我目前的场景中不太可能) 您可能想从中使用Dir.mktmpdir。它将处理一个真正唯一且无冲突的目录名,该名称考虑了系统时间和进程id。您可能希望从中使用Dir.mktmpdir。它将处理一个真正唯一且无冲突的目录名,该名称考虑了系统时间和进程id。确实如此,但强制时间在过去一毫秒后至少相差1(在某些情况下是2),只有当您将其乘以100

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


您可能想从中使用
Dir.mktmpdir
。它将处理一个真正唯一且无冲突的目录名,该名称考虑了系统时间和进程id。

您可能希望从中使用
Dir.mktmpdir
。它将处理一个真正唯一且无冲突的目录名,该名称考虑了系统时间和进程id。

确实如此,但强制时间在过去一毫秒后至少相差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
此外,如果希望获得唯一的名称,可以使用ruby版本的GUI。但是如果你需要创建一个唯一的临时文件夹,你应该使用ruby的方法来创建一个临时文件夹,正如在前面的回答中所指出的那样。

的确如此,但是强制时间在过去的一毫秒之后至少相差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
此外,如果希望获得唯一的名称,可以使用ruby版本的GUI。但是如果您需要创建唯一的临时文件夹,您应该使用ruby的方法创建一个临时文件夹,正如前面的答案中所指出的那样

我认为不是,因为,在毫秒以下,没有两个日期是相同的

你假设当你从系统时钟得到时间时,你有毫秒的分辨率。即使获得了毫秒数,但这并不意味着硬件的分辨率为1毫秒

对于大多数现代计算机和操作系统来说,它接近10毫秒。如果你预计会有大量的呼叫,你当然可以读取几毫秒的时间,他们可以得到相同的准确时间戳

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

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

我认为不是,因为,在毫秒以下,没有两个日期是相同的

你假设当你从系统时钟得到时间时,你有毫秒的分辨率。即使获得了毫秒数,但这并不意味着硬件的分辨率为1毫秒

对于大多数现代计算机和操作系统来说,它接近10毫秒。如果你预计会有大量的呼叫,你当然可以读取几毫秒的时间,他们可以得到相同的准确时间戳

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


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

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

时钟很可能在时间上向后跳,然后得到两倍相同的值


不要将时间用于唯一值计算机通常会定期更新时钟以纠正漂移

时钟很可能在时间上向后跳,然后得到两倍相同的值


不要将时间用于唯一值只需付出一点额外的努力,就可以完全避免问题,为什么不立即这样做呢

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

  • 使用连续的数字命名目录。创建时,您需要列出现有目录,找到编号最高的目录,然后尝试创建一个编号为+1的目录。如果出现竞争条件,它可能会失败,这就是您应该重试它的原因(Ruby的
    retry
    语句可能非常适合这种情况)
  • 使用UUID命名目录。同样,您可能也会遇到冲突,因此如果目录已存在,则需要重试尝试

  • 你只需付出一点点额外的努力,就可以完全避免这个问题,为什么不马上这样做呢

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

  • 使用连续的数字命名目录。创建时,您需要列出现有目录,找到编号最高的目录,然后尝试创建一个编号为+1的目录。如果出现竞争条件,它可能会失败,这就是您应该重试它的原因(Ruby的
    retry
    语句可能非常适合这种情况)
  • 使用UUID命名目录。同样,您可能也会遇到冲突,因此如果目录已存在,则需要重试尝试

  • 好吧,那么,如果两个人可以,那完全有可能,对吧?在这一点上,它不再是不可能的,充其量也变得不可能。而且,作为程序员,我们必须提前思考,为那些不太可能发生的事件编写程序,以及在这种情况下我们将要做什么。但除此之外,他们可以吗?当然可以。这就是重点。不要依赖时间戳来确保唯一性。您的应用程序不必受欢迎,就可以将同一时间戳应用于两次上载。只是运气不好。你甚至不需要坏运气。用户无意中双击按钮并非闻所未闻。一个这样的用户会把你的计划搞砸。那么,如果两个用户都能,那完全有可能,对吗?在这一点上,它不再是不可能的,充其量也变得不可能。而且,作为程序员,我们必须提前思考