0

我正在尝试将 128 位二进制文​​件转换为 sql 中与 .net 和 java 中相同的唯一标识符。

我知道java使用大端,所以我想以此为基础。

我可以在 .net 中获得正确的字节顺序,但在 SQL Server 中我真的很挣扎。

爪哇:

        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 时,我能够让所有三个产生相同的值,但 GUID 让我感到困惑。

原始问题

原始答案

4

2 回答 2

1

如果您更正googleSQL 示例中的拼写(goolge在您的帖子中),您将得到正确的结果。

于 2013-04-16T15:27:36.687 回答
1

SQL Server 不支持 UTF-8 编码。请参阅在 SQL Server 中存储 UTF-8 数据的说明。使用 Michael Harmon 的建议将您的 .NET 函数添加到 SQLServer 以进行转换。有关如何将 .NET 函数添加到 SQLServer 的说明,请参阅如何编码...。

或者,不要在 Java 和 .NET 代码中指定 UTF-8。我相信 SQL Server 会像 Java 和 .NET 一样对 varchar 使用相同的 256 位编码。(但不完全确定这一点。)

于 2013-04-15T18:16:22.113 回答