データベースの主キー列に一意の Long ID を生成する必要があります。
私はUUID.randomUUID().getMostSignificantBits()を使用できると思っていましたが、時々それが負の長さを生成することもあり、これは私にとって問題です。
UUID から正の long のみを生成することは可能ですか?数十億のエントリがあるため、生成された各キーは一意である必要があります。
UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE
これが機能する理由は、bitwise & with 1 を実行すると同じ数字がそのまま渡され、bitwise & with 0 を実行するとブロックされ、結果が 0 になるためです。現在、バイナリの Long.MAX_Value は
0111111111111111111111111111111111111111111111111111111111111111
これは 0 の後に 63 個の 1 が続きます (合計は 64 ビットで、Java では長くなっています)。
したがって、上記の数値で数値 X をビット単位で & すると、左端のビットがゼロになることを除いて、同じ数値 X が得られます。つまり、その数値の符号のみを変更し、値は変更していません。
http://commons.apache.org/sandbox/commons-id//index.htmlを見てください 。必要なものを正確に提供できる LongGenerator があります。
さらに、Hibernate を使用している場合は、ID を生成するように依頼することができます (選択可能なアルゴリズムがいくつかあります) 。ファイル/repo1.maven.org/maven2/hibernate/hibernate/2.1.8/net/sf/hibernate/id/TableHiLoGenerator.java#TableHiLoGenerator )
私はちょうどこの解決策に出くわしました。私はとりあえず解決策を理解しようとしています.それはTwitterスノーフレークのJava実装を言います. Twitter スノーフレーク ID 生成アルゴリズムに基づく 64 ビット シーケンシャル ID ジェネレーター。
https://github.com/Predictor/javasnowflake
どんな提案でも大歓迎です。