gpt4 book ai didi

java - SQL Server Java 兼容 GUID/UUID(Big Endian 唯一标识符)

转载 作者:行者123 更新时间:2023-12-02 07:10:00 30 4
gpt4 key购买 nike

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

我知道 java 使用大端字节序,所以我想将其作为基础。

我可以在 .net 中获得正确的字节顺序,但在 SQL Server 中却遇到了困难。

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

.Net

    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 让我感到困惑。

Original Issue

Original Answer

最佳答案

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

关于java - SQL Server Java 兼容 GUID/UUID(Big Endian 唯一标识符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15644323/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com