monotonically increasingの整数を生成する必要があります。単調増加する整数を生成する
何らかの形でこのようなタイプの整数シーケンスを生成するためにタイムスタンプを使用できますか?
私は一度に整数を要求し、同じ秒の間隔で整数以上を要求することはありません - もしそうであれば、その秒の間隔内に同じ整数が渡されても構わないでしょう。
monotonically increasingの整数を生成する必要があります。単調増加する整数を生成する
何らかの形でこのようなタイプの整数シーケンスを生成するためにタイムスタンプを使用できますか?
私は一度に整数を要求し、同じ秒の間隔で整数以上を要求することはありません - もしそうであれば、その秒の間隔内に同じ整数が渡されても構わないでしょう。
AtomicInteger
オブジェクトを使用すると、スレッドセーフカウンタを維持できます。次の整数が必要な場合は、getAndIncrement()
を使用します。
単調に増加する整数(すなわち限り数が増加し続けると、ギャップが存在することができます)連続している必要はありません、とあなたは同じ秒で行われたすべてのコールが同じ整数を返すようにしたいように聞こえるので、 、JVMが何秒間アップしたかを返すメソッドはうまくいくでしょう。
private static long startTime = System.currentTimeMillis();
public static int secondsSinceStart() {
return (int) TimeUnit.SECONDS.convert(
System.currentTimeMillis() - startTime, TimeUnit.MILLISECONDS);
}
FYI、これはロールオーバーする前に68年続くだろう:
はここであることない単純な実装です。
ありがとう@ボヘミアン!皆さんの提案からインスパイアされた私は、ミリ秒(JVMが稼動しているので)を1000で割って 'System.currentTimeMillis() - startTime)/ 1000'秒を取得して整数の範囲に収めるのはどうかと考えていました。そして、1000で除算するのではなく、10ビット右にビットをシフトすることによって、1024で高速分割することで近似することができました。 '(System.currentTimeMillis() - startTime)>> 10'です。パフォーマンスのために尋ねるだけです。 –
実際には、私のコード*は1000で除算しますが、上記はAPIを使用してミリ秒から秒に変換する方法です。あなたはそれを1000で除算することができますが、これはもっと見栄えが良いと思いました。パフォーマンスに関しては、この方法はMacBookで約60ナノ秒で実行されます。ほとんどのアプリケーションでは十分高速です。 – Bohemian
はい、それはもっときれいですが、パフォーマンス面では、ビットシフトが10ビット(1024で除算される)が1000で除算した場合よりも優れたパフォーマンスを発揮すると思います。 –
私は質問します:シングルトンクラスのいくつかの静的メンバーでゼロをカウントしてカウントアップしてみませんか? – phs
"整数"とは、32ビットを意味しますか、または64ビット整数であれば問題ありませんか? – Bohemian
@phs:yesは不完全な情報である可能性があります(申し訳ありませんが、不完全な情報のため)DBに保存する必要がありますので、Webアプリケーションサーバーを再起動して最後の値を復元することができます –