Javaでは、特定のVMインスタンスで一意であることが保証されたタイムスタンプ(ミリ秒単位)を作成する必要があります。私。 System.currentTimeMillis()のスループットを抑えて、msごとに最大で1つの結果を返すようにする必要があります。どのようにそれを実装する上で任意のアイデアですか?Javaでユニークなタイムスタンプを作成する
答えて
これにより、可能な限り重複することなく現在の時刻を近づけることができます。
private static final AtomicLong LAST_TIME_MS = new AtomicLong();
public static long uniqueCurrentTimeMS() {
long now = System.currentTimeMillis();
while(true) {
long lastTime = LAST_TIME_MS.get();
if (lastTime >= now)
now = lastTime+1;
if (LAST_TIME_MS.compareAndSet(lastTime, now))
return now;
}
}
1ミリ秒あたり1つのIDの制限を回避する1つの方法は、マイクロ秒のタイムスタンプを使用することです。すなわち、currentTimeMSに1000を掛ける。これにより、1000ミリ秒/ミリ秒が可能になる。
注:NTP修正のために時間が後退すると、時間が追いつくまでに1回の呼び出しごとに1ミリ秒で進行します。 ;)
最も正確な利用可能なシステムタイマーであるSystem.nanoTime()
を使用して、百万分の1秒を分けることができます。更新頻度に関する正式な保証はありませんが、1ミリ秒に1回より頻繁に更新すると仮定することは妥当と考えています。もちろん、整数のタイムスタンプをミリ秒未満の間隔で作成すると、すべてが一意であるとは限りません。
なお、絶対値nanoTime()
は任意です。絶対時間が必要な場合は、何らかの方法で調整します。つまり、起動時にそれをcurrentTimeMillis()
と比較します。
私は下記の試み、それが異なる値を与えるたびに、おそらく、すべての時間一意であることが保証されていませんが、あなたはより良い精度のため
をSystem.nanoTime()
を使用することができます。
public static void main(String[] args) {
long time1 = System.nanoTime();
long time2 = System.nanoTime();
long time3 = System.nanoTime();
System.out.println(time1);
System.out.println(time2);
System.out.println(time3);
}
もう一つの方法は、時間があなたのために重要ではなく、あなただけの固有の番号が必要な場合、これはおそらくbtterの選択肢であるユニークな番号についてAtomicInteger
/AtomicLong
クラスを使用することです。
nanoTimeは単調ですが、必ずしも一意ではありません。あなたは重複をたくさん得ることができます。例えばRed Hat&Centos 5.xでは、分解能はマイクロ秒であるため、繰り返しの価値がたくさんあります。 –
情報ありがとうございます。私はそれがOSとマシンに依存していると推測しました。 – fmucar
nanoTimeを使用して、それとは異なるチェックをすることができます。 (私のソリューションに似ています)nanoTimeは、多くのシステムで稼働時間が秒単位で表示されます。 –
おそらくjava.util.UUID
を使用し、それはtimestamp()
とclockSequence()
でしょうか?ここ
Method Summary
int clockSequence()
The clock sequence value associated with this UUID.
long timestamp()
The timestamp value associated with this UUID.
詳細:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/UUID.html
ソリューションを探している間、私は(汎用一意辞書順でソート可能な識別子) https://github.com/huxi/sulky/tree/master/sulky-ulid/
それは長くはないが、短い ULIBに出くわしました次にUUID。
A ULID:
- はUUID/GUIDの 1と互換性があります。ミリ秒あたり21E + 24一意ULIDs
- 辞書ソート
- より良い効率と読みやすさのためにクロックフォードのbase32を使用
- 36文字のUUIDとは対照的に、正準、26文字列として符号化された(5ビット(1,208,925,819,614,629,174,706,176は正確には)
- )文字ごとに、それはせいぜい*を返すように)私はあなたが(*スロットリング*にcurrentTimeMillisを何を意味するのかはよく分からないん特殊文字(URL安全)
- 1. Java - ユニークなソリューションで迷路を作成
- 2. JavaのArrayListにユニークな項目のArrayListを作成する
- 3. ユニークでないタイムスタンプのPandas DataFrameスライスデータ
- 4. MongoDBでユニークな配列を作成
- 5. Objectboxでユニークなインデックスを作成
- 6. Javaで3つの変数にユニークなインデックスを作成する方法は?
- 7. ユニークな番号を自動生成JAVA
- 8. タイムゾーンなしでタイムスタンプを作成
- 9. Jenkinsfileでタイムスタンプを作成する
- 10. JavaScriptでUTCタイムスタンプを作成する
- 11. 動的でユニークなバーコードでアンケートを作成する
- 12. グループのユニークなIDを作成
- 13. ユニークなキーワードのマスターリストを作成
- 14. PHPで異なるユーザーのユニークなテーブルを作成
- 15. Neo4jでユニークなシーケンス番号を作成する方法は?
- 16. RethinkDBでユニークなアイテムを作成する方法
- 17. Codeigniterでユニークなフィールドを作成するDBForgeの移行
- 18. Doctrine2のYMLでユニークな制約を作成する方法は?
- 19. PyMongo 2つ以上のフィールドでユニークなインデックスを作成する
- 20. mongoDBでユニークなインデックスを作成する方法は?
- 21. iOSで毎回ユニークな文字列を作成するには?
- 22. ユニークな文字列でバープロットを作成する
- 23. Googleのアプリエンジンでユニークなキー名を作成する方法
- 24. Jinjaでユニークなペアのリストを作成するには?
- 25. hsqldb/liquibaseの関数でユニークなインデックスを作成する
- 26. パンダシリーズのタイムスタンプをユニークな日付のリストに変換する
- 27. ユニークな文字列をタイムスタンプに変換する
- 28. (ユニークでない)ランダムリストを生成する
- 29. シンプルなユニークな予約ID機能を作成する
- 30. 永続的なユニークなリンクを作成する
が
単調増加する必要がありますか?彼らは実際の時間と何らかの関係を持たなければなりませんか?それらは複数回にわたって一意でなければならないのですか? –