可能重複:
Formulas to generate a unique id?有沒有什麼辦法可以生成一個與UUID(GUID)不同的唯一編號?
基本上我需要生成一個唯一的號碼,但我不希望它是太長,如UUID。大小的一半(如果不小)。
任何人都可以想到任何方式來做到這一點?
基本上我有一個應用程序可能被多人使用,應用程序生成文件並將它們上傳到Web服務器。這些名稱必須是唯一的。
順便說一下,我不想用數據庫表跟蹤這些東西。
可能重複:
Formulas to generate a unique id?有沒有什麼辦法可以生成一個與UUID(GUID)不同的唯一編號?
基本上我需要生成一個唯一的號碼,但我不希望它是太長,如UUID。大小的一半(如果不小)。
任何人都可以想到任何方式來做到這一點?
基本上我有一個應用程序可能被多人使用,應用程序生成文件並將它們上傳到Web服務器。這些名稱必須是唯一的。
順便說一下,我不想用數據庫表跟蹤這些東西。
生成一個UUID,只取前半部分字符串。
如果你擔心產生重複的ID,你的選擇是讓他們非隨機和自動遞增,或檢查新生成的ID的存在:
do {
newId = generateNewId();
} while (idExists(newId));
你是說不可能有2個UUID的字符串? – Testifier 2012-08-13 20:56:54
當然可以。儘管你生成一個完整的UUID還是比較好的,但它的可能性是天文數字。如果你不相信隨機性是均勻分佈的,那麼把整個UUID的每一個字母,或者只是生成你自己的隨機字符串。字面上有數以千計的如何做的例子。 – meagar 2012-08-13 20:57:47
+1。注意事項:由於鴿子的原理,沒有辦法讓任何有限的值成爲唯一的。 UUID生成算法保證(儘可能)唯一性的整個值,幷包含根據不同的食堂(時間/隨機值,生成的部分... ...) - 因此,而不是第一部分可能會更好地散列/異或部分UUID以獲得好的隨機數。 – 2012-08-13 21:03:13
如果你需要它獨特和短的去與UUID和使用URL縮短。
激起了我的好奇心:
// create a 32-bit uid:
var i = BitConverter.ToUInt32(Guid.NewGuid().ToByteArray(), (new Random()).Next(0, 12));
// create a 64-bit uid
var l = BitConverter.ToUInt64(Guid.NewGuid().ToByteArray(), (new Random()).Next(0, 8));
當然,因爲你失去很多時候你截斷它一個GUID的特徵以下可同樣適用,還不如採取隨機數:
l = BitConverter.ToUInt64(BitConverter.GetBytes((new Random()).NextDouble()), 0);
...如果你正在尋找一個64位整數。
什麼語言?什麼操作系統? – 2012-08-13 20:55:25
C#,Windows,對不起! – Testifier 2012-08-13 20:55:42
這是非常通用的,除了把它作爲數千個其他的「如何生成一個隨機數?」的副本來關閉它之外,沒有明智的答案。的問題。 – meagar 2012-08-13 20:55:54