メインコンテンツへスキップ
  1. Posts/

重複防止にタイムスタンプを使うのを止めろ

·444 文字·1 分
プログラミング
maruTA / Takayuki MARUYAMA
著者
maruTA / Takayuki MARUYAMA

以下のような、日時(タイムスタンプ)を使って重複しない(ユニークな)文字列を生成しようとする試みを未だに見かけるのですが

String temporaryFileName = System.currentTimeMillis() + ".tmp";
File temporaryFile = new File("/tmp/" + temporaryFileName);

絶対に重複して大事故になるから今すぐ止めなさい。


この試みがユニークであることを保証できるのは、同時に実行されないように排他制御されていて(例: Javaのsynchronized)、複数回連続で実行される場合は1ミリ秒以上間隔が空く場合だけです。
マルチコアCPU・Webアプリケーションでは複数リクエストが同時に処理されますから、ミリ秒精度のタイムスタンプだと容易に重複します。
分散システムとかスケールアウトした状態ならより重複しやすくなるんだから、ナノ秒精度にすれば良いって話でもないですからね?


ユニークな文字列が欲しいなら、UUIDv4等、重複しないことが保証されるような文字列生成方法を使いましょう。
特に一時ファイルを作成する場合は、どのプログラミング言語でもユニークなファイル名で作成する方法が用意されているはずです。(例: Javaは Files#createTempFile)