JavaのUUIDのcompareToはType1のUUIDが正しく動作しません

blankCoder:

すべてのタイプ1であるか、またはDatastax CassandraのJavaドライバライブラリ(UUIDS.timebased())を使用して、時間ベースと生成されたデータは、UUIDでソートする必要があるユースケースに取り組んでいる間、私はUUID.compareToはいくつかのソートされていないことがわかっ正しくのUUID。compareToのロジックはあります

    /**
 * Compares this UUID with the specified UUID.
 *
 * <p> The first of two UUIDs is greater than the second if the most
 * significant field in which the UUIDs differ is greater for the first
 * UUID.
 *
 * @param  val
 *         {@code UUID} to which this {@code UUID} is to be compared
 *
 * @return  -1, 0 or 1 as this {@code UUID} is less than, equal to, or
 *          greater than {@code val}
 *
 */
public int compareTo(UUID val) {
    // The ordering is intentionally set up so that the UUIDs
    // can simply be numerically compared as two numbers
    return (this.mostSigBits < val.mostSigBits ? -1 :
            (this.mostSigBits > val.mostSigBits ? 1 :
             (this.leastSigBits < val.leastSigBits ? -1 :
              (this.leastSigBits > val.leastSigBits ? 1 :
               0))));
}

私は、Javaのためのdatastaxカサンドラドライバを使用して生成された2以下のUUIDを持っていました。

UUID uuid1 = java.util.UUID.fromString("7fff5ab0-43be-11ea-8fba-0f6f28968a17")
UUID uuid2 = java.util.UUID.fromString("80004510-43be-11ea-8fba-0f6f28968a17")
uuid1.timestamp() //137997224058510000
uuid2.timestamp() //137997224058570000

以上のことから、UUID1がUUID2よりも小さくなっていることは明らかであるが、私たちはUUID compareToメソッドを使用してそれらを比較するとき、我々は異なる出力を得ます。このUUID1がUUID2よりも大きいことを示していることがより少ないことになっていると我々は-1として出力を取得する必要がありますが、我々は1として答えを得ます

uuid1.compareTo(uuid2) //output - 1

これをさらなる分析に、UUID1ためMSBは正の数であるように負の数にUUID2変換するためのMSBことを見出しました。このためのcompareToにおけるロジックは、1の代わりに-1の値を返しています。

u_7fff5ab0 = {UUID@2623} "7fff5ab0-43be-11ea-8fba-0f6f28968a17"
mostSigBits = 9223190274975338986
leastSigBits = -8090136810520933865

u_80004510 = {UUID@2622} "80004510-43be-11ea-8fba-0f6f28968a17"
mostSigBits = -9223296100696452630
leastSigBits = -8090136810520933865

この動作は、UUIDと互いの比較で正常ですか?そうならば、どのように我々は、このような時間ベースのUUIDのソートを扱うのですか?

ありがとうございました

ruhul:

比較時間ベースのUUIDは、特別な注意が必要であることに注意してくださいドキュメントから

最後に、してくださいカサンドラのtimeuuidソートがUUID.compareToと互換性がないことに注意してください(java.util.UUID)、したがって、UUIDは、この方法で作成されたが、必ずしもその後者の方法のために下界されていません。

時間ベースのUUIDがと比較すべきではありませんjava.util.UUID#compareToUUID基づいて、2つの時間を比較するには、比較する必要があり、時間を。これらの二つの内UUIDが含まれていカスタムユーティリティメソッドの実装を必要とするか、ちょうど2つのtimesstampsを比較します。ここでそれを行う方法の例は次のとおりです。

// must be timebased UUID
int compareTo(UUID a, UUID b){
   return Long.compare(UUIDs.unixTimestamp(a),UUIDs.unixTimestamp(b));
}

より多くを学ぶために、この通過しDOCS

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=6362&siteId=1