2

String、BigDecimal、org.joda.time.LocalDate、org.joda などのさまざまなデータ型の Java オブジェクトのコレクションから一意の ID (String/Number など) を生成する方法についてのアイデアを得たいと思います。 time.LocalDateTime または任意のカスタム Java オブジェクト。

生成された ID は、Java オブジェクトの値に基づいている必要があります。これにより、同じ値を持つ 2 つのコレクションに対して同じ ID が生成されます。SQL GROUP BY 句に似たもの。col1、col2、および col3 は任意のデータ型にすることができる (col1、col2、col3) によるグループから一意の ID を生成したいと考えています。

4

3 に答える 3

0

タイプが変更されない場合に一意のキーを作成するには、次を使用できます

String id = Arrays.toString(col1, col2, col3);

タイプが混在していても一意である必要がある場合は、バイナリ形式を生成するシリアル化を使用できます。

StringBuilder idsb = new StringBuilder();
for(Object o: arrayOfObjects) 
    idsb.append(o.getClass()).append(':').append(o).append(',');
String id = idsb.toString();

あなたが持っている場合

Object col1 = "2012-04-19 12:13:46", col2 = "2012-05-02", col3 = "Andy";
String key = col1+"~"+col2+"~"+col3;
于 2012-12-13T12:30:17.687 に答える
0

ハッシュコードベースのアプローチを試すことができます

public static UUID id(List<?> list) {
    BigInteger prime = BigInteger.valueOf(31);
    BigInteger value = BigInteger.valueOf(list.size());
    for (Object element : list) {
        value = value.multiply(prime).add(BigInteger.valueOf(element.hashCode()));
        value = value.multiply(prime).add(BigInteger.valueOf(element.getClass().hashCode()));
    }
    return UUID.nameUUIDFromBytes(value.toByteArray());
}

ただし、これは 100% の一意性を保証するものではありません。

于 2012-12-13T12:53:11.890 に答える
0

たとえば java.lang.Object には値がないため、どのオブジェクトに対しても実行できません。値で識別できるものについては、単純ではありませんが解決策があります。

作成

MessageDigest md = MessageDigest.getInstance("MD5");

ID を作成したいオブジェクトのすべてのフィールドを反復処理し、それらをバイトに変換し (どういうわけか、最悪の場合 (フィールド + "").getBytes())、これらのバイトでダイジェストを更新します。

md.update(fieldBytes);
md.update(new int[0]);   we need separator to be safe

最終的に ID を BigInteger として取得します

  BigInteger id = new BigInteger(1, md.digest());

16進文字列に変換することもできます

String hex = String.format("%032X", id)

それは実質的にユニークです。MD5 は 16 バイトです。または、SHA-1 を使用することもできます。これはより強力で、20 バイトです。

于 2012-12-13T12:53:25.603 に答える