2012-01-16 5 views
3

monotonically increasingの整数を生成する必要があります。単調増加する整数を生成する

何らかの形でこのようなタイプの整数シーケンスを生成するためにタイムスタンプを使用できますか?

私は一度に整数を要求し、同じ秒の間隔で整数以上を要求することはありません - もしそうであれば、その秒の間隔内に同じ整数が渡されても構わないでしょう。

+2

私は質問します:シングルトンクラスのいくつかの静的メンバーでゼロをカウントしてカウントアップしてみませんか? – phs

+0

"整数"とは、32ビットを意味しますか、または64ビット整数であれば問題ありませんか? – Bohemian

+0

@phs:yesは不完全な情報である可能性があります(申し訳ありませんが、不完全な情報のため)DBに保存する必要がありますので、Webアプリケーションサーバーを再起動して最後の値を復元することができます –

答えて

3

AtomicIntegerオブジェクトを使用すると、スレッドセーフカウンタを維持できます。次の整数が必要な場合は、getAndIncrement()を使用します。

1

単調に増加する整数(すなわち限り数が増加し続けると、ギャップが存在することができます)連続している必要はありません、とあなたは同じ秒で行われたすべてのコールが同じ整数を返すようにしたいように聞こえるので、 、JVMが何秒間アップしたかを返すメソッドはうまくいくでしょう。

private static long startTime = System.currentTimeMillis(); 

public static int secondsSinceStart() { 
    return (int) TimeUnit.SECONDS.convert(
     System.currentTimeMillis() - startTime, TimeUnit.MILLISECONDS); 
} 

FYI、これはロールオーバーする前に68年続くだろう:

はここであることない単純な実装です。

+0

ありがとう@ボヘミアン!皆さんの提案からインスパイアされた私は、ミリ秒(JVMが稼動しているので)を1000で割って 'System.currentTimeMillis() - startTime)/ 1000'秒を取得して整数の範囲に収めるのはどうかと考えていました。そして、1000で除算するのではなく、10ビット右にビットをシフトすることによって、1024で高速分割することで近似することができました。 '(System.currentTimeMillis() - startTime)>> 10'です。パフォーマンスのために尋ねるだけです。 –

+1

実際には、私のコード*は1000で除算しますが、上記はAPIを使用してミリ秒から秒に変換する方法です。あなたはそれを1000で除算することができますが、これはもっと見栄えが良いと思いました。パフォーマンスに関しては、この方法はMacBookで約60ナノ秒で実行されます。ほとんどのアプリケーションでは十分高速です。 – Bohemian

+0

はい、それはもっときれいですが、パフォーマンス面では、ビットシフトが10ビット(1024で除算される)が1000で除算した場合よりも優れたパフォーマンスを発揮すると思います。 –