2015-12-15 26 views

回答

0

獨特的ID可以用許多不同的方式生成。 SYS(2015)只有在給定的過程中才是唯一的,您可以通過將全局整數計數器放入臨界區域來獲得。

如果你想看到類似於SYS(2015)的東西,那麼你可以使用GetSystemTimeAsFileTime(),將最後一次分配的值存儲在受關鍵部分保護的全局變量中。如果當前值不大於最後一個值,則遞增最後一個值並返回該值。通過這種方式,如果競爭激烈,身份證可以在當前時間之前運行一段時間,但實時性會在慢速時段趕上。作爲編碼,您可以使用base64,剝離「=」並以適當的方式替換字符「/」和「+」。

如果你想創建一個有可能在給定的機器上唯一的文件名,那麼你可以比散列機器名,進程ID,線程ID和系統時間的級聯做差了不少(UNC爲FILETIME) 。你可以使用散列的base64表示的左邊八個字符(用'$'和'_'代替'/'和'+')來獲取可用作標識符,列名等的名稱。這些名稱並不是唯一的 - 它們碰撞的可能性相對較低。通過在名稱中使用更多的哈希字符,您可以獲得儘可能低的碰撞可能性。

另一種方法是直接使用上述連接,在做一些格式化和替換操作後,使其與您想要的名稱域兼容。例如。將id生成的進程ID,線程ID和UNC文件時間轉換爲十六進制,並插入合適的分隔符。然後,只要機器名稱是唯一的,就可以保證在整個網絡中唯一的ID。

如果您需要在給定機器或網絡上保證唯一的短名稱,那麼您可以使用受合適IPC機制保護的全局計數器。最簡單的方法是將計數器放到一個表中,並依靠數據庫引擎(例如FoxPro)獲取必要的IPC。

或者您可以將計數器放入.ini文件並使用Win32字節範圍鎖定或互斥文件(管理創建空專用互斥文件的人對.ini具有鎖定)。

另一種選擇是使用一個二進制文件 - 純粹的巧合 - 看起來像一個有效的.DBF文件,並使用鎖定協議 - 純粹的巧合 - 與VFP的鎖定協議兼容。這意味着甚至C#或Delphi都可以從VFP用自己的Foxy方式管理的id表中獲取整數id。我在生產中使用了這樣一個模塊,並結合共享內存訪問方法(只是一個用於獲取新ID的裸InterlockedIncrement()),可以在所有使用者都在同一臺機器上運行時使用。

可能性實際上是無止境的,但只有在知道具體要求時才能提出具體建議。

0

一個比SYS(2015)更妙的是:

var uniqueValue = Guid.NewGuid();