Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server Java兼容GUID/UUID(大端唯一标识符)_Java_.net_Sql Server_Uniqueidentifier_Endianness - Fatal编程技术网

SQL Server Java兼容GUID/UUID(大端唯一标识符)

SQL Server Java兼容GUID/UUID(大端唯一标识符),java,.net,sql-server,uniqueidentifier,endianness,Java,.net,Sql Server,Uniqueidentifier,Endianness,我正在尝试将128位二进制文件转换为sql中的唯一标识符,该标识符与.net和java中的相同 我知道java使用big-endian,所以我希望以此为基础 我可以在.net中获得正确的endianess,但在SQL Server中我确实很难做到这一点 爪哇: 返回1d5920f4-b44b-27a8-02bd-77c4f0536f5a .Net 返回1d5920f4-b44b-27a8-02bd-77c4f0536f5a SQL 返回D86B5A7F-7A25-4895-A6D0-63BA3A

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

我知道java使用big-endian,所以我希望以此为基础

我可以在.net中获得正确的endianess,但在SQL Server中我确实很难做到这一点

爪哇:

返回1d5920f4-b44b-27a8-02bd-77c4f0536f5a

.Net

返回1d5920f4-b44b-27a8-02bd-77c4f0536f5a

SQL

返回D86B5A7F-7A25-4895-A6D0-63BA3A706627

在转换为int64时,我能够让这三个生成相同的值,但GUID让我感到困惑


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


或者,不要在Java和.NET代码中指定UTF-8。我相信SQLServer将使用与Java和.NET相同的256位varchar编码。(但并不完全确定。)

如果您在SQL示例中更正了
google
的拼写(您的帖子中是
goolge
),您会得到正确的结果。

您是否考虑过在SQL Server中编写.Net CLR函数?不必挑剔,但您的SQL为什么会显示:
声明@s VARCHAR(MAX)='goolge.com'
而不是
DECLARE@s VARCHAR(MAX)='google.com'
?还有一个问题:您确定使用VARCHAR数据类型将字符串编码为与您在Java和.NET中使用的UTF-8编码相同的字节吗?也许您可以先检查中间结果,确保.NET和sql server的起始字符串字节相同(在创建MD5哈希之前)。很好,Sam。我检查了所有内容,除了明显的。这三个例子现在都返回相同的结果。散开!UTF-8是我的SQL Server实例的默认值。如果您的实例不同,则需要相应地修改java/.net代码。
        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));
    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;
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
    )