2010-08-31 231 views
1

我正在尋找一種爲本地創建的記錄類生成唯一標識符,然後以各種格式(XML,SQL等)持久化的方法什麼是在VB.NET中生成本地唯一標識符的首選方法?

我見過使用DateTime和GetHashCode的人,但是似乎有助於根據樣本大小重複標識符。

GUID有點矯枉過正,因爲我不需要任何在全球範圍內獨特(大)的東西。我也知道使用GUIDs和GetHashCode來縮小尺寸,但重複的東西往往會出現在這裏。

任何人都可以提出一個最佳做法或方法來生成簡單的唯一標識符嗎?

+0

只是想感謝大家的意見。爲了安全,我繼續使用GUID。 – knslyr 2010-09-01 01:39:25

回答

5

指導或增加計數器。

的Guid可以產生「空氣」,但需要更多的空間

對於計數器你需要存儲櫃檯的地方,你將需要做,如果你使用的線程線程安全。但它的體積較小。

1

GetHashCode絕對是不是非常好的選擇。

你想要標識符有多大?

如果你有永久存儲來記住「最後生成」的標識符(例如數據庫),那麼每次只需遞增一個數字就足夠了。如果您沒有持久存儲空間,則可以使用DateTime來獲取自某個固定日期起的毫秒數。這顯然會限制你每毫秒只能生成一個標識符,但根據你的情況,這應該是確定的。

如果您有多個進程同時生成標識符,您可以將時間戳與您的進程ID結合使用或避免重複。

+0

我希望能夠使用長度爲5到8個字符的標識符。 我考慮過timestamp選項,因爲我實際上可以保證每毫秒不會產生一個以上的記錄,但我不確定這是否被認爲是一種好的做法,或者可能有更常用的方法。 – knslyr 2010-08-31 21:03:21

+0

.Net中DateTime的分辨率約爲10ms,因此它是10ms中的一個唯一數字,不是1ms。 – 2010-08-31 22:41:23

+0

@亞歷克斯:是的,這是一個很好的觀點。 – 2010-08-31 23:13:57

5

實現你自己幾乎總是一個錯誤。小的唯一號碼需要確實可靠記錄上次使用的號碼。這很難實現,硬盤出現磁頭崩潰,註冊表偶爾損壞。您需要對其進行組織,以確保單點故障。類似於dbase的自動遞增列。確保最後一個號碼是否丟失,還有完全丟失的數據。這意味着,一方面,用戶不應複製數據而不復制最後一個數字的記錄。或者您始終擁有可靠的全部副本,並且可以從中恢復最後一個號碼。很快。

您還很難確保原子序數的增加。剛啓動兩個程序實例通常足以造成混亂。修復這很棘手,你需要一個獨立的仲裁器進程來存儲這個數字。

那麼就有必要猜測10年或20年後會發生什麼。那麼您的應用程序可以擴展以滿足當時的需求?這是很少見,計算機越來越快完成了。什麼是當地唯一號碼現在需要成爲一個全球唯一的號碼。 非常不同類型的要求。

不要擰這個,16字節是沒有什麼。使用Guid。

相關問題