2012-04-21 98 views
2

手動更改生成的GUID並使用它有多糟?碰撞的可能性仍然不明顯,或者用GUID操縱是危險的嗎?手動更改GUID - 它有多糟?

有時我們只是更改以前生成的GUID的一些字母並使用它。我們應該停止這樣做嗎?

+0

沒有其他的想法,(這傢伙奇妙的解釋和恰好是SO太瞭解它) GUID衝突? – jumbo 2012-04-24 16:33:56

+1

爲什麼做出改變,爲什麼不直接產生一個完全新的GUID – 2012-06-05 06:58:17

+0

@DanielPowell我認爲這是來自懶惰...:/ – jumbo 2012-06-05 08:11:16

回答

6

這取決於GUID的版本和您正在進行更改。讓我們來剖析一個小一個GUID實際上是如何的樣子:

  1. 一個GUID有一個版本。  GUID中的第13個十六進制數字標記其版本。當前的GUID通常由版本4生成。如果向後更改版本,則可能與已存在的GUID發生衝突。改變它,你有可能與未來的潛在GUID相沖突。

  2. GUID也有一個變體。  GUID中的第17個十六進制數字是變體字段。它的一些值被保留用於向後兼容,一個值被保留用於未來的擴展。因此,改變某些內容意味着您可能會與以前生成的GUID或將來生成的GUID發生衝突。

  3. 根據版本的不同,GUID結構有所不同。 版本4 GUID使用(大部分 - 除了第17個十六進制數字)真正的隨機或僞隨機比特(大多數實現pseuso-random)。改變那裏的東西,你的碰撞概率保持不變。

    對於使用哈希的版本3和5的GUID應該是非常相似的,雖然我不記得在野外看過一個。不過,版本1和2並非如此。這些都有一個結構,取決於你改變某些東西的位置,這使你難以做到。

  4. 版本1的GUID包括時間戳和如果在相同的時鐘間隔產生兩個的GUID(並且因此將導致相同的時間標記),其被遞增的計數器字段。如果更改時間戳,則可能會與在同一臺計算機上早期或稍後生成的GUID發生衝突。如果更改計數器,則會與同時生成的GUID發生衝突,因此需要計數器作爲「唯一值」。

  5. 版本2 GUID擴展到版本1幷包含用戶ID。 時間戳較不精確,並且包含用戶或組ID,而計數器的一部分用於指示哪一個意味着哪一個(但它只對發電機有意義)。因此,如果更改這些部分,則可能會與同一臺計算機上的其他用戶生成的GUID發生衝突。

  6. 版本1和2的GUID包含MAC地址。 具體而言,生成它們的計算機的MAC地址。這確保即使在同一時刻生成不同機器的GUID也是不同的。如果一臺機器沒有MAC地址,但沒有唯一性保證,則有後備。一個MAC地址也有一個結構,由一個「Organisationally Unique Identifier」(OUI;它由本地管理或由IEEE分發)和一個網卡的唯一標識符組成。

    如果您在OUI中進行更改,您可能會與其他製造商的網卡計算機中生成的GUID發生衝突。除非您進行更改,否則第一個八位組的第二個最低有效位爲1,在這種情況下,您將切換到本地管理的OUI,並且只會與具有重寫的MAC地址的計算機上生成的GUID發生衝突(可能會包括大多數虛擬機與虛擬網絡硬件)。

    如果你偶然卡標識符你同一製造商與其他網絡卡的計算機上生成的GUID冒險碰撞,又與那些MAC地址被覆蓋。

沒有其他版本至今存在,但要點如下:一個GUID需要它的所有部件,以確保其唯一性;如果你改變了一些東西,你最終可能會得到一個不一定是唯一的GUID。所以你可能會更多地使用GID或其他東西。最安全的改變可能是當前版本4的GUID(這是Windows和.NET將生成),因爲他們並不真正保證獨特性,而是使其非常,非常不可能

一般來說,我會說你好得多生成一個新的GUID,雖然。這也可以幫助讀者閱讀它們,因爲如果兩個GUID看起來完全不同,就可以很容易地區分出兩個GUID。如果他們只在一個數字上有所不同,那麼一個人可能會錯過這個改變,並假定GUID是相同的。

進一步閱讀:

+0

非常非常好的答案。謝謝你。你在最後一段中提到了很好的一點 - 關於它們的視覺相似性,即使沒有碰撞也是問題。我印象深刻:) – jumbo 2012-06-05 08:10:28

+0

我有時會感到無聊;-)。至於視覺上的相似性:這已經讓我陷入了過去,如果你只是假設兩件事情是平等的,並且爲什麼你的代碼不像你想象的那樣行事,那真的很煩人。 – Joey 2012-06-05 08:18:50

0

我不知道這將如何影響GUID的唯一性,但它可能不是一個好主意。

Visual Studio有一個內置的GUID生成器,需要幾秒鐘才能啓動並創建一個新的GUID。如果你不使用VS,那麼還有其他簡單的方法來創建一個新的。 This page has 2 scripts(VB腳本和PHP)將完成這項工作並here's a .net version

+0

是的,我們使用Visual Studio,我們也使用該生成器,但有時我們甚至懶惰,以至於我們不使用它並手動改變它:)我們已經決定必須使用這個生成器,但是我們遇到了討論這種做法的危險性。 – jumbo 2012-04-22 12:12:26