2014-01-20 37 views
1

給定兩個GUID,A和B,我執行C = A^B。結果是GUID嗎?通過XOR合併兩個GUID的結果是否滿足作爲GUID的條件?

(如果是這樣,我可以使用,而不是產生一個第三GUID來表示包含由A和B表示的兩個對象的對象)

+0

你是如何得到前兩個GUID的?你從哪裏得到可能會生成GUID的提示? –

+0

相關:[如何組合兩個GUID值](http://stackoverflow.com/questions/1383030/how-to-combine-two-guid-values) – herohuyongtao

+0

您可以通過單獨XOR其數據,然後將它們組合一起。雖然它可能不是唯一的。 – herohuyongtao

回答

3

GUID是什麼,但在0的範圍的均勻隨機數到2 - 1。從理論的角度來看,沒有什麼這保證它們是有史以來唯一的,但作爲this question敏銳地表明,GUID是獨特在實踐中由於碰撞的可能性極低。

考慮到只有兩個要求需要滿足:1)範圍和2)均勻的隨機性,很容易證明兩個GUID的XOR確實是一個GUID。

試想一下,如果GUID的只有兩位,那麼我們就可以檢查所有可能的方案:

 
^ 00 01 10 11 
00 00 01 10 11 
01 01 00 11 10 
10 10 11 00 01 
11 11 10 01 00 

所有可能的結果1)具有相同的範圍爲00〜11,和2)同樣可能發生。

此規則的唯一例外情況是,如果兩個源GUID中的一個全爲零,導致由此產生的XOR與另一個產生衝突。

請注意,異或不是唯一具有此功能的操作 - 添加兩個GUID並截斷溢出位也會生成一個GUID。

+1

是的,但是...回到糟糕的時代,GUID是由(可能)幾個輸入建立的 - 只有一部分是一致隨機的(因爲隨機可以被建模)。 GUID應該使用第一個字節的前三位來表示源。不知道這是否仍然是慣例。維基百科[說](https://en.wikipedia.org/wiki/Globally_unique_identifier)一個隨機源GUID應該仍然包含6個固定位 - 仍然是一個很好的大分佈 - 但這使得典型的組合只是一個接觸複雜。組合後,您應該可以恢復6個固定位。 – Clay

1

是對結果的GUID

如果你把一個guid當作一個128位的數字,那麼當然,你可以對這些位進行XOR並創建一個代表這些位的新Guid。它仍然是「唯一」的,因爲只有一個由該128位序列表示的Guid。並且結果的分佈將與輸入一樣均勻,因爲應用於「隨機」輸入集合的異或函數產生與其輸入相同的分佈。

1

一年半之後 - 和啓動矛盾 - 但我認爲答案是「可能不是」。規範的GUID具有結構,並且該結構的一部分將通過異或兩個GUID而變得混亂。 GUID中有位描述here所描述的源。

早期的GUID生成器引起了一些隱私問題,它們使用MAC地址作爲方案的一部分,大多數應用程序都轉而使用隨機化的GUID生成器......但也有例外。例如,您可以讓SQL Server生成「順序」GUID(聽起來很糟糕,但背後有很好的推理)。

也有將URL轉換爲GUID的標準方法。這裏的想法是每個做它的人都以同樣的方式執行 - 所以GUID到URL的映射可以用標準方式完成 - 查找函數可以圍繞這個標準映射進行優化。你可以找到更多here

我確定許多home-rolled GUID生成器不尊重GUID類型字段,因此生成的值不是技術上有效的GUID。

因此,假設兩個規範的隨機來源的GUID一起異或,結果是類型指示符字段將被清零。類型位應該真正地進行或運算。如果其中一個或兩個GUID是從其他來源構建的,則會變得有點醜陋。