【问题标题】:Is converting to the uniqueidentifier datatype static?转换为 uniqueidentifier 数据类型是静态的吗?
【发布时间】:2016-07-11 16:28:41
【问题描述】:

我在 SQL Server 2012 中工作。我正在尝试从用户名中“计算”一个唯一编号,以便在查询中屏蔽其他用户名。我发现了 uniqueidentifier 数据类型,想知道这是否对于每次查询运行都保持静态,即使在不同的机器上也是如此。

例如,如果我们有一个 xyz 的用户名,我正在做一些字符串操作以使用户名与其他用户名不同,然后将其转换为 varbinary 0x78797A。但是,这显然会根据用户名的长度而有所不同。我不希望用户能够看到一个长 varbinary 集并假设(可能正确)它是具有最长用户名的人。

然后我将此 varbinary 转换为 uniqueidentifier 数据类型。运行几次后,看起来这个新值将保持静态,但我不确定这是否是因为我在同一台机器上运行它。无论何时运行或在何处运行,我都需要它是静态的。 uniqueidentifier 是否有可能在任何情况下使用相同的输入产生不同的值?

【问题讨论】:

  • 将 varbinary 转换为 uniqueidentifier 是确定性的。但这似乎不是一个有用的方法。您如何处理超过 16 个字符的名称?如果更短,您如何将 varbinary 填充到 16 个字节?零仍将显示长度。 rextester.com/NFTDHM25938
  • @MartinSmith,感谢您提供确定性信息!没错,这不是最有用的方法,但我没有权限使用 SQL Server 的某些允许其他类型加密的功能。就我的目的而言,16 个字符的限制不会成为问题,并且显示长度的零 的相关性比我想象的要小。感谢您的反馈!
  • 请注意,任何散列函数(即使是长度像 SHA2_512 的散列函数)都有可能发生冲突

标签: sql sql-server


【解决方案1】:

您可以使用 SQL 哈希函数。当给定相同的输入时,它将保持静态。 MD2是我在这个例子中使用的算法的名称,但是你可以选择其他的。

MD2、MD4、MD5 中的任何一个都是 16 个字符

SHA、SHA1 中的任何一个都是 20 个字符

SHA2_256 将是 32 个字符

SHA2_512 将是 64 个字符

DECLARE @UserName VARCHAR(25) = 'xyz'
SELECT
     @UserName UserName
    ,HASHBYTES('MD2',@UserName) UserNameHash
    ,LEN(HASHBYTES('MD2',@UserName)) CharLength

关于哈希字节的 MSDN 文章: https://msdn.microsoft.com/en-us/library/ms174415.aspx

【讨论】:

  • 这是一个很好的想法,也很简单,但听起来 SeanC 有一个观点,即它不一定是独特的。我有一个类似的想法,即用用户名播种一个随机数,但我认为标识符仍有可能不明显。如果我生成了足够的数字,则概率非常,但仍然......无论如何,感谢您的洞察力!
  • 如果你想要一个真正不同的值,你可以添加一个 uniqueidentifier 列并用SELECT NEWID() 填充它。但是,这不是计算出来的,它是 SQL 给出的一次性不同值。 SHA 或 SHA1 发生冲突的几率也超过 1*10^18 中的 1。 hash-collision-probabilities。我很好奇,所以我查了一下。
  • 是的,我认为概率极低,所以这很有趣。当然,我永远不会中彩票,但如果有机会,我会将相同的 ID 分配给不同的用户。 :)
猜你喜欢
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 2012-03-03
  • 2018-04-06
  • 1970-01-01
相关资源
最近更新 更多