2016-07-11 69 views
0

我在SQL Server 2012中工作。我試圖從用戶名中「計算」一個唯一的數字,以便在查詢中掩蓋其他用戶的用戶名。我發現了uniqueidentifier數據類型,並且想知道這是否對於查詢的每次運行都保持靜態,即使在不同的機器上。正在轉換爲uniqueidentifier數據類型static?

例如,如果我們有XYZ的用戶名,我做了一些字符串操作混雜的用戶名起來,保持它從別人不同的方式,然後將其轉換爲VARBINARY0x78797A。但是,根據用戶名的長度,這顯然會有所不同。我不希望用戶能夠看到很長的varbinary集合並假設(可能正確)它是最長用戶名的人。

然後,我將此varbinary轉換爲uniqueidentifier數據類型。運行這幾次後,它看起來好像這個新值將保持靜態,但我不確定這是否是因爲我在同一臺機器上運行它。無論何時運行或在哪裏,我都需要靜態的。在任何情況下,uniqueidentifier是否有可能在相同輸入中產生不同的值?

+1

將varbinary轉換爲uniqueidentifier是確定性的。 但這似乎不是一個有用的方法。 你如何處理長於16個字符的名字?如果更短,你如何將varbinary填充到16個字節?零將仍然顯示長度。 http://rextester.com/NFTDHM25938 –

+0

@MartinSmith,感謝它是確定性的信息!您說得對,這不是最有用的方法,但我沒有權限使用某些其他類型的加密功能的SQL Server功能。就我的目的而言,16個字符的限制不會成爲問題,並且顯示長度的零與我認爲的相關性會減少很多。我很欣賞反饋! –

+1

請注意,任何散列函數(甚至一個長度如SHA2_512)都有可能發生衝突 – SeanC

回答

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文章HASHBYTES: https://msdn.microsoft.com/en-us/library/ms174415.aspx

+0

這是一個很簡單的想法,但它聽起來像SeanC有一點不一定是明顯的。我有一個類似的想法,即用用戶名填充一個隨機數,但發現仍然有可能標識符不會不同。如果我產生了足夠的數字,那麼這個概率很小,但仍然...無論如何,感謝您的洞察力! –

+0

如果你想要一個真正獨特的值,你可以添加一個uniqueidentifier列並用'SELECT NEWID()'填充它。但是,這不是計算的,它是SQL給出的一次性截然不同的值。SHA或SHA1碰撞的可能性也超過1 * 10^18。 [散列碰撞概率(http://preshing.com/20110504/hash-collision-probabilities/)。我很好奇,所以我查了一下。 –

+0

是的,我認爲這個概率非常低,所以這很有趣。當然,我永遠不會贏彩票,但如果有機會,我會爲不同的用戶分配相同的ID。 :) –