2010-10-27 81 views
1

我正在製作一個位圖編輯器,其中一個文檔由多個圖層組成,其中每個圖層都表示一個位圖。與文檔中當前存在的所有其他圖層相比,每個圖層都必須具有唯一的ID。我還需要考慮到我需要保存和加載文檔以及圖層ID。如何給文檔中的每個對象一個唯一的ID?

我使用的命令模式來存儲在文檔上執行,並且唯一的ID被用於跟蹤哪些層的應執行上的動作的動作。

此刻,我只是保持一個稱爲X計數器,當創建一個新層,它的ID設置爲X,則X遞增。加載時,我需要確保將X設置爲適當的數字,以便爲新圖層賦予唯一ID,即我可以保存X的值並恢復該值,或者根據加載的最大圖層ID設置X.

假設X是一個32位的號碼,用戶將需要創建4,294,967,296層在同一個文件上工作之前的ID開始得到重用,這將導致怪異的行爲。我應該實施一個更好的獨特的身份證系統嗎?或者這通常足夠好?

我在Java中,所以我可以使用UUID庫,它根據標準算法創建128位唯一ID。儘管這似乎過分了。

這種問題是否有一些通用的方法?

+0

您是否有一個令人信服的理由_不使用UUID? – 2010-10-27 10:10:34

+0

我能想到的唯一的情況是1)UUID 128位ID佔用更多空間,比普通整數比較慢2)UUID方法的概率性質使我感到不安(不是一個很好的理由,但你去了)。我的意思是,我是否只是按照自己的想法創建新的UUID,並期望它們始終是唯一的,即使它們是隨機生成的? – RichardNewton 2010-10-27 16:48:22

回答

0

如果您認爲您可能以編程方式操作圖層,並因此在圖像的生命週期中擁有2^32圖層的可能性,則在讀取文件時將所有圖層ID放入HashSet中,然後更新該集合當你添加/刪除圖層時。 (您不需要明確地存儲該集合;與每個掩碼相關聯的ID就足夠了。)然後,不要「取得下一個數字」,而是「不在集合中的下一個數字」。有一個計數器仍然有用,但是當你讀取一個文件時,是否將它設置爲0或(max + 1)是不重要的;除非您想象會同時出現大量的圖層,否則不會花費大量的時間來找到空白空間。

不過既然你使用的是Java,你可以只使用一個長而不是一個整數,然後你就不會永遠(實際而言)能夠溢出的數量,即使你所做的一切是創建一個單像素掩碼並一遍又一遍地摧毀它。

+0

這些都是非常好的一點,謝謝!使用Java的UUID庫(使用128位ID)的一個親是我不必擔心該代碼中的錯誤。自己管理ID將需要我進行更多的測試。嗯......我想我可以在啓動時將計數器設置爲零,並且無論何時我需要一個新的ID,只要不斷增加它直到找到一個未使用的ID。 – RichardNewton 2010-10-27 05:49:57

4

這已經足夠好了。以24/365每秒10個新圖層的速度,這是愚蠢的,它將運行良好大約三年。

相關問題