2017-02-22 10 views
1

私はSnowcast https://github.com/noctarius/snowcastを自分のアプリケーションのユニークなIDジェネレータとして使用します。これらのIDをWebアプリケーションのURLに公開します。Hazelcast Snowcastシーケンスジェネレータのエポックとイドの長さ

今、私は私の春のブートアプリケーションでSnowcastシーケンサを設定するには、どのように2つのオプションがあります。Calendar基づきエポックの場合のsnowcastSequencer.next()メソッド呼び出しの結果として

@Bean 
public SnowcastSequencer snowcastSequencer(Snowcast snowcast) { 
    Calendar calendar = GregorianCalendar.getInstance(); 
    calendar.set(2017, Calendar.FEBRUARY, 1, 0, 0); 
    SnowcastEpoch snowcastEpoch = SnowcastEpoch.byTimestamp(calendar.getTimeInMillis()); 

    return snowcast.createSequencer("sequence_generator", snowcastEpoch); 
} 

または

@Bean 
public SnowcastSequencer snowcastSequencer(Snowcast snowcast){ 
    SnowcastEpoch snowcastEpoch = SnowcastEpoch.byTimestamp(new Date().getTime()); 

    return snowcast.createSequencer("sequence_generator", snowcastEpoch); 
} 

を私は次の長い値を得ています:

15617925960433665 

しかしDate基づきエポックの場合:

12046041089 

私は2番目のいずれかのよう...短いのIDでもっと興味が、私はIDが可能一意性の問題を心配します。

ユニークなIDの場合は、Dateに基づいてエポックを使用してもよろしいですか?

答えて

1

これらの数字の生成方法を見ると、1つのIDが複数の部分で構成されているため、IDが短くないことがわかります。タイムスタンプはそのうちの1つです。それは、エポック(最初の数ビット)へのオフセットが増加するため、IDが時間の経過とともに変化すると言いました。ある時点では、すべてのビットが使用されるので(最上位ビットでさえも)、long値はJavaのポイントから負の値に切り替わり、負に見えるようになります(または、符号なしlongとして印刷する必要があります。ビッグ・インテンサー)。

といっても、短くても長いものではありませんが、エポックオフセット(エポックの開始から何ミリ秒経過したか)と1ミリ秒でノード/ IDの数に依存します。

PS:アプリのランタイムの途中でユニークなIDを生成するだけの場合は、どちらも完璧です。

+0

あなたの答えをありがとう!今私は考えなければならないか、または私のURLに負の値を持つことは大丈夫です。 – alexanoid

+0

負の値の生成を避ける方法はありますか?私の解は負の値を受け入れることができません(( – alexanoid

+0

いいえ、申し訳ありませんが、最上位ビットはエポックミリ秒に使用されるため、常に負の値を持つ可能性があります)。 – noctarius

関連する問題