44

データベースの主キー列に一意の Long ID を生成する必要があります。

私はUUID.randomUUID().getMostSignificantBits()を使用できると思っていましたが、時々それが負の長さを生成することもあり、これは私にとって問題です。

UUID から正の long のみを生成することは可能ですか?数十億のエントリがあるため、生成された各キーは一意である必要があります。

4

6 に答える 6

53
UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE

これが機能する理由は、bitwise & with 1 を実行すると同じ数字がそのまま渡され、bitwise & with 0 を実行するとブロックされ、結果が 0 になるためです。現在、バイナリの Long.MAX_Value は

0111111111111111111111111111111111111111111111111111111111111111 

これは 0 の後に 63 個の 1 が続きます (合計は 64 ビットで、Java では長くなっています)。

したがって、上記の数値で数値 X をビット単位で & すると、左端のビットがゼロになることを除いて、同じ数値 X が得られます。つまり、その数値の符号のみを変更し、値は変更していません。

于 2017-01-12T12:33:47.170 に答える
8

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 )

于 2013-03-03T12:00:37.573 に答える
3

私はちょうどこの解決策に出くわしました。私はとりあえず解決策を理解しようとしています.それはTwitterスノーフレークのJava実装を言います. Twitter スノーフレーク ID 生成アルゴリズムに基づく 64 ビット シーケンシャル ID ジェネレーター。

https://github.com/Predictor/javasnowflake

どんな提案でも大歓迎です。

于 2013-03-03T11:37:12.740 に答える