0

タイプUUIDのフィールドをマップしたいと思います。私はそれを次のように生成しています:

java.util.UUIDをインポートします。UUID id = UUID.randomUUID();

これを使用することに問題はありますか?これにはどのコンバーターを使用できますか?

4

1 に答える 1

1

ランダム!=一意。非常に非常に高い数では、衝突する可能性があります。一部の人々はこれで大丈夫です....確率が10億分の1に近い可能性があるとしても、それが起こった場合、それをデバッグすることはPITAであるため、私はそれを避けたいと思います。

また、非常に非常に高い数では、衝突する可能性が高くなります。

このリンクを読む

http://johannburkard.de/blog/programming/java/Java-UUID-generators-compared.html

基本的に、私は彼のコードを一度見て、一意であるために、それは実際にはそのコンピューター内のMacアドレス+ UNIQUEタイムスタンプであるため、2つのスレッドが同じタイムスタンプを取得することは許可されていません。

実際、@ NoSqlIdを使用する場合、実際にはtimeA +ホスト名からの一意のカウンターを使用しているため、1つのクラスター内で一意です。1つのクライアントは、主キーを適切かつ短く保つa1、a2、a3のホスト名を使用します。これまで考えたことはありませんでしたが、キーに@NoSqlIndexを追加すると、キーの範囲をクエリでき、時間順になります。

おそらく、時間ベースの別のジェネレーターを作成して、人々が主キーおよびクエリの時間範囲として使用できるようにする必要があります(これが、クライアントが必要と思うものではなく、クライアントが必要とするものの順に作業するときに役立つ場合は、問題を追加してください)。

上記についてあなたの質問に答えるために。コンバーターを作成でき、byte []からUUIDに移行するときは、次を使用できます。

public static UUID nameUUIDFromBytes(byte[] name)

ただし、逆方向に進むと、Javaソースコードからの関数とは逆のことを行う必要があります。

public static UUID nameUUIDFromBytes(byte[] name) {
    MessageDigest md;
    try {
        md = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException nsae) {
        throw new InternalError("MD5 not supported");
    }
    byte[] md5Bytes = md.digest(name);
    md5Bytes[6]  &= 0x0f;  /* clear version        */
    md5Bytes[6]  |= 0x30;  /* set to version 3     */
    md5Bytes[8]  &= 0x3f;  /* clear variant        */
    md5Bytes[8]  |= 0x80;  /* set to IETF variant  */
    return new UUID(md5Bytes);
}

ありがとう、ディーン

于 2012-10-18T00:55:29.523 に答える