我正在尝试将 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 让我感到困惑。