SQL Server Java兼容GUID/UUID(大端唯一标识符)
我正在尝试将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 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
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
)