0

私は128ビットのバイナリを.netやjavaと同じSQLのuniqueidentifierに変換しようとしています。

私はJavaがビッグエンディアンを使用していることを知っているので、それをベースにしたいと思います。

.netで正しいエンディアンを取得できますが、SQLServerでは本当に苦労しています。

Java:

        byte[] bytesOfMessage = "google.com".getBytes("UTF-8");

        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] md5 = md.digest(bytesOfMessage);
        ByteBuffer bb = ByteBuffer.wrap(md5);
        LongBuffer ig = bb.asLongBuffer();
        return new UUID(ig.get(0), ig.get(1));

1d5920f4-b44b-27a8-02bd-77c4f0536f5aを返します

。ネット

    System.Security.Cryptography.MD5 c = System.Security.Cryptography.MD5.Create();
    byte[] b = c.ComputeHash(Encoding.UTF8.GetBytes("google.com"));
    int z = System.Net.IPAddress.HostToNetworkOrder(BitConverter.ToInt32(b, 0));
    short y = System.Net.IPAddress.HostToNetworkOrder(BitConverter.ToInt16(b, 4));
    short x = System.Net.IPAddress.HostToNetworkOrder(BitConverter.ToInt16(b, 6));
    Guid g = new Guid(z, y, x, b.Skip(8).ToArray());
    return g;

1d5920f4-b44b-27a8-02bd-77c4f0536f5aを返します

SQL

DECLARE @s VARCHAR(MAX) = 'google.com' --'goolge.com'

DECLARE @md5 BINARY(16) = HASHBYTES
        (
            'MD5',
            @s
        )

DECLARE @a BINARY(4) = 
        CONVERT
        (
            BINARY(4),
            REVERSE
            (
                CONVERT
                (
                    BINARY(4),
                    LEFT(@md5, 4)
                )
            )
        )

DECLARE @b BINARY(2) = 
        CONVERT
        (
            BINARY(2),
            REVERSE
            (
                CONVERT
                (
                    BINARY(2),
                    RIGHT(@md5, 12)
                )
            )
        )

DECLARE @c BINARY(2) = 
        CONVERT
        (
            BINARY(2),
            REVERSE
            (
                CONVERT
                (
                    BINARY(2),
                    RIGHT(@md5, 10)
                )
            )
        )

DECLARE @d BINARY(8) = 
        CONVERT
        (
            BINARY(8),
            RIGHT(@md5, 8)
        )

SELECT  
    CONVERT
    (
        UNIQUEIDENTIFIER,
        @a + @b + @c + @d
    )

D86B5A7F-7A25-4895-A6D0-63BA3A706627を返します

int64に変換するときに、3つすべてで同じ値を生成することはできますが、GUIDで困惑しています。

元の問題

元の回答

4

2 に答える 2

1

SQLServerはUTF-8エンコーディングをサポートしていません。SQLServerでのUTF-8データの保存の説明を参照してください。Michael Harmonからの提案を使用して、.NET関数をSQLServerに追加し、変換を実行します。.NET関数をSQLServerに追加する方法については、「エンコードする方法...」を参照してください。

または、Javaおよび.NETコードでUTF-8を指定しないでください。SQL Serverは、Javaや.NETと同じ256ビットエンコーディングをvarcharに使用すると思います。(しかし、これについては完全にはわかりません。)

于 2013-04-15T18:16:22.113 に答える
1

googleSQLの例(goolge投稿にあります)のスペルを修正すると、正しい結果が得られます。

于 2013-04-16T15:27:36.687 に答える