2012-04-03 69 views
1

我正在尋找一種簡單但強大的解決方案來調配獨特的部件號。我一直在考慮使用GUID來識別來自不同客戶端(臺式機,電話等)的請求,然後根據請求GUID的插入日期時間順序分配PN。雲上的唯一ID生成

問題:SQL Azure是否使用正確的服務?有沒有一個標準的方法呢?

謝謝。

回答

7

這與「在雲端」無關,而是一般的分佈式計算問題。

您的問題中沒有足夠的信息來充分理解您的要求,但我收集的是您需要爲請求零件號的服務的使用者分配唯一號碼。

首先想到的是GUID是一個數字(128位長)。只要您需要分配零件號碼,您不能只生成一個GUID嗎?如果需要的話,你可以將GUID散列成一個無符號長整數(城市哈希是我最喜歡的64位散列,用於這種類型的應用),散列衝突的風險非常小,除非你處理數十億個零件號。如果你覺得你想要散列成32位數字,可以看看Birthday Problem。散列衝突將比僅用32位更爲頻繁。

如果您必須分配序號,則必須在處理中引入序列化點。您將需要一些服務(可能是數據庫表上的標識列)來統計單個部件號請求並分配下一個更大的數字。

如果您通常希望數量較小,但它們不一定必須是連續的,則可以允許每個可能處理這種請求的服務器管理它自己的數字範圍(例如,給定的服務器可以「檢出」一個塊從中央服務器中分配1000個零件號碼,分配它們直到它們用完,然後「檢出」一個新的數字塊)。這並不能保證當前分配的所有號碼都是連續的,因爲多臺服務器可以以不同的速率分配號碼。另外,如果您沒有正確管理應用程序崩潰,您可以「丟失」已簽出但未完全分配的數字塊的一部分。

+0

是否有一個C#實現CityHash在那裏? – JMarsch 2012-04-03 22:07:32

+0

@JMarsch:在那裏,不,但從C++端口非常簡單。我在一個小時內爲一位前僱主做了這件事。 – 2012-04-03 22:54:30

+0

@EricJ .:我提到了雲,因爲我們沒有可以保證可用性接近雲解決方案的服務器。我們有人出門在外,需要爲報價生成PN。我認爲我們有點在同一頁面上。我最初的想法是將請求GUID插入到數據庫中,然後生成PN。 – 2012-04-04 20:36:04

0

你可能想看看這一個:SnowMaker – a unique id generator

+0

我也在看。謝謝 – 2012-04-04 20:39:15

+0

SnowMaker在Azure移動服務上進行了一些修改(主要涉及移動服務dll而不是項目中包含的移動服務dll)對我而言效果很好。 – 2015-03-10 01:38:52