我们有一个使用以下内容在TSQL中创建uuid的过程:
SELECT Cast( HASHBYTES('MD5', 'some string') as uniqueidentifier)
我在节点js中创建了一个API,他们希望我能够从'some string'创建相同的唯一标识符。那可能吗?使用crypto,我可以获得与HASHBYTES命令(crypto.createHash('md5').update('some string').digest("hex")
)相同的十六进制值,但我不知道如何将其转换为TSQL返回的相同uuid。
我相信我想要的是v3 uuid,但我不知道命名空间是什么。我想SSMS可能正在使用某些特定于服务器的值来创建uuid,但我能够在三个不同的服务器上获得相同的值,两个在我们的网络上,另一个在随机的EC2实例上。
我是否误解了uuid的一些非常基本的东西?或者是否有一些特定于Microsoft SQL Server的命名空间,在所有服务器之间是否一致?
我检查过的节点库:uuid, UUID-1345, UUID-lib中, GUID
我也尝试过aguid库,它似乎做了我想要的但是在SHA256中。我借用了代码并将其切换为md5,但后来我看到所有库正在进行的操作是使用哈希并在某些字符索引处添加4或8。
答案 0 :(得分:0)
一位朋友想出了TSQL如何处理cast作为uniqueidentifier。他们只是重新排列哈希的字符!以下是您在Javascript中的表现方式:
var castAsUuid = function(str){ var x = str.substring(6, 8) + str.substring(4, 6) + str.substring(2, 4) + str.substring(0, 2) + '-' + str.substring(10, 12) + str.substring(8, 10) + '-' + str.substring(14, 16) + str.substring(12, 14) + '-' + str.substring(16, 20) + '-' + str.substring(20, 32)
返回x.toUpperCase() }
他们似乎每次都以同样的方式(尝试了大约十个不同的字符串)。好时光。