2011-08-22 37 views
1

我需要生成一個後綴來唯一化一個值。我想過使用當前的數據和時間,但需要後綴不超過5個字節。是否有任何散列方法可以從yyyyMMddHHmmss格式的日期生成5個字節或更少的散列?如何將yyyyMMddHHmmss格式的日期減少爲5個字節?

還有其他想法嗎?維護一個運行計數器並使用下一個值會很簡單,但是我不希望依賴任何類型的存儲值。

+0

您的日期範圍是多少?當然,[Unix時間](http://en.wikipedia.org/wiki/Unix_time)值得注意的是,這也取決於散列的編碼要求。 –

回答

3

如果您不需要依賴可打印字符,我會建議您只需使用Unix timestamp。即使使用4字節(直到2038年1月19日),這樣也會很好。

如果你只想使用字符的一個子集,我會建議你創建一個你想要使用的值列表。

  • 假設你想使用字母(大小寫)和數字 - > 62的值。
  • 現在你需要convert the timestamp into base-62。比方說,你的時間戳是100:
  • 100 =( * 62^1)+( * 62^0)
  • 如果您保存在一個數組可打印值,你可以使用係數和作爲該數組的索引。

如果你選擇你的基地小,五個字節將是不夠的。在這種情況下,您可以從時間戳中減去一個常數(這會爲您購買一段時間),或者您可以估計何時會出現重複時間戳,以及該日期是否已超過您的退休日期;-)

+0

只是想補充一點:如果你不需要在1970年之前使用時間,但是想避免[Y2K38錯誤](http://en.wikipedia.org/wiki/Year_2038_problem),你可以使用32位/ 4字節的UNIX時間如果確保將其始終視爲**無符號**值,則用於存儲郵票。這將推遲到2106年的問題。 – snap

+0

這是完美的。我發現了一個很好的類,在[這個答案]中進行了轉換(http://stackoverflow.com/questions/529647/need-a-smaller-alternative-to-guid-for-db-id-but-still-unique -and-random-for-url/529852#529852),而不是使用Unix時間,我將代碼作爲原點使用午夜,擴展了可用範圍。 –

相關問題