1

c# donet は、次の Java コードに対して同じ UUID を生成できますか? もしそうならどのように?GUID を試しましたが、うまくいきませんでした。

文章:

String cleartext = "CN=CompanyName;mac=some mac;@host=somehost;email=admin@somedomain.com;issued=01/01/20013;expire=12/12/2013";

Java コード:

UUID uuid = UUID.nameUUIDFromBytes(cleartext.getBytes("UTF-8"));

C# コード:

byte[] b = System.Text.Encoding.UTF8.GetBytes(cleartext);
        Guid uid = new Guid(b);
        Console.Write(uid.ToString());

REF 以前の議論

4

3 に答える 3

1

このコードは、.NET では確実に機能しません。

Guid(Byte[])コンストラクターは 16 バイト (Guid は 128 ビットであるため) を受け取る必要があり ます。そうしないと、ArgumentException がスローされます。あなたの文字列は 16 バイトをはるかに超えています。

ただし、そうは言っても、コンストラクターに渡された同じ 16 バイトを使用して、C# と Java が同じ UUID を生成することはありません。Java では、任意のバイト数をUUIDコンストラクターに渡すことができ、それらのバイトのハッシュが作成されます。言い換えると:

C# の場合:

Guid g = new Guid(new Byte[] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16});
Console.WriteLine(g);

以下とは異なる値を生成します。

UUID u = UUID.nameUUIDFromBytes(new byte[] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16});
System.out.println(u);

...ジャワで。

おそらく、.NET のByte[16]コンストラクターを Java に実装するか、Java のハッシュ コンストラクターを .NET に実装できますが、両方のプラットフォームで UUID の文字列表現を使用することをお勧めします"190c4c10-5786-3212-9d85-018939108a6c"

文字列からハッシュを作成しようとしている場合は、MD5 クラスにチェックインすることをお勧めします。次のようなものが必要です。

var md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(cleartext);
byte[] hashBytes  = md5.ComputeHash(inputBytes);

MD5 は標準アルゴリズムであり、.NET と Java の両方で同じ文字列に対して同じハッシュを生成します。

于 2013-08-02T16:35:27.863 に答える
0

相互運用性が必要な場合は、制御できないコードに依存しないでください。Java のバージョンまたは実装ごとに変更される可能性があります。

使用されている方法を取ることができます

/**
 * Static factory to retrieve a type 3 (name based) {@code UUID} based on
 * the specified byte array.
 *
 * @param  name
 *         A byte array to be used to construct a {@code UUID}
 *
 * @return  A {@code UUID} generated from the specified array
 */
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);
}

ソース

それをコードにコピーします。他の言語でもそれを正確に作成すれば、問題は解決するはずです。

「タイプ 3 (名前ベース) UUID」が結果が正確に指定されている標準である場合、実装が異なる結果を返すことはないため、Java でのコピーをスキップできます。他の言語の実装も見つかる可能性が高く、手動で移植する必要はありません。

于 2013-08-02T16:46:06.043 に答える