2013-10-14 62 views
0

任何人都可以提出,如果我用下面的代碼來生成ID爲我的文件,將它是唯一的始終。 由於100s窗體在自動填充身份證文本框中自動填充ID的自動創建窗體。所以它應該是線程安全的,如果我重新啓動應用程序,它不應該重複應用程序隨時停止之前已經生成的id。ID生成了多種形式

private static final AtomicLong count = new AtomicLong(0L); 
    public static String generateIdforFile() 
    { 
     String timeString = Long.toString(System.currentTimeMillis(), 36); 
     String counterString = Long.toString(counter.incrementAndGet() % 1000, 36); 
     return timeString + counterString; 
    } 

而窗體正在使用ClassName.generateIdforFile()獲取Id;

+0

如果你有DB;那麼你可以進入序列,這樣雖然你的應用程序重新啓動,DB仍然提供下一個序列值。 –

回答

0

如果您使方法同步,則​​不需要使用AtomicLong變量。

由於併發通過使用同步的關鍵字確保。

使用過度併發變量妨礙效率和應用程序的性能。

+0

謝謝,但你能告訴法爾將給予變量唯一值總是因爲它是從System.currentTimeMillis的()和獨特性越來越變頻器將不會對IDS妨礙在任何情況下,就像我問重新啓動應用程序不應該重新生成任何其已經產生的id應用程序停止前。 – zdhim

+0

爲什麼不添加PID呢? –

+0

那麼這兩個System.currentTimeMillis的組合()和PID將使其更加具體,具有獨特的價值提供給我們。 – Scientist

0

更好地使用全局AtomicLong開始於0L爲您的整個應用程序。然後你連接CurrentTimeMillis

static AtomicLong counter = new AtomicLong(0L); 

public static String generateIdforFile() 
{ 
    String timeString = Long.toString(System.currentTimeMillis(), 36); 
    String counterString = Long.toString(counter.incrementAndGet() % 1000, 36); 
    return timeString + counterString; 
} 

這有更大的機會獲得唯一的ID,甚至重新啓動應用程序之間,前提是你的應用程序需要比一些毫秒關閉並重新啓動多一點。請注意,該方法不再同步。 (不需要)並且還提供了,您在同一毫秒內創建少於一千個文件。但是你不能保證通用的唯一性。

+0

謝謝,對不起,可以有大約1000個文件可以立即觸發獲得身份證,這就是爲什麼我申請睡眠。UUID我不想使用,因爲它的長度。只是希望通過使用此代碼ID應該是唯一的,以便將來獨立於應用程序/服務器崩潰,並且恢復後不應與舊文件ID衝突。 – zdhim

+0

順便說一句,將模數改爲10000或100000或36的任何冪。 ;)或者完全降低模量。這種方法不應該有明確的睡眠。順便說一下,我不知道Sleep(1)在哪個平臺上做你期望的。睡眠會釋放分配給您的線索的時間段,並不保證您在1毫秒後準確獲得另一個時間段。至少1ms後(更可能是10ms或20ms)。我所描述的過程保證了唯一性,只要'counter'變量在同一毫秒內不會被重置。 –

+0

嗨,我已經更新了代碼,你現在可以告訴它是可以的。或者在哪種情況下,它可以創建重複。 – zdhim

1

爲什麼不只是使用UUID作爲您的文件ID?您可以使用類似以下內容:

public static String generateIdforFile() { 
    return UUID.randomUUID().toString(); 
} 

或者您是否需要(正在進行的)數值?

如果數字只是必須是數字(而不是持續的),你可以使用UUID#getLeastSignificantBits()UUID#getMostSignificantBits()的數值。

報價this answer on SO

所以你的UUID的最顯著一半包含 隨機性,這意味着你平均需要生成2^29的UUID到 獲得碰撞的58位(與2^61爲完整的UUID)。

您當然不會像使用完整的UUID那樣具有碰撞安全性。

+1

+1雖然系統重新啓動,但它始終是唯一的。 –