2010-05-08 21 views
1

如果您使用過GoToMeeting,那就是我想要的ID類型。我希望它是隨機的,以便模糊正在跟蹤的項目的數量並縮短,以便手動引用很容易; UUID太長了。我想避免僅僅爲了性能原因而實現持久存儲,但我想不出任何其他方式來避免衝突。 9位數字是否足以做一些基於時間的事情?有沒有辦法生成一個短的隨機ID,避免碰撞,沒有持久存儲?

在回答問題:

  • 我建立一個票據跟蹤應用程序。這個ID將被用作表的主鍵,但是在記錄被保留之前需要這個ID,這會導致額外的數據庫調用,如果可能的話,我想避免這種調用。

  • 我想保留它在9位整數。我認爲UUID太長,因爲人們不得不手動引用ID(通過電子郵件,電話等)。

  • 我想用某種方式使用生成時間。由於時間總是在前進,所以它會持續限制潛在ID的集合,不包括那些已經生成的潛在ID。

+0

基於時間,在什麼範圍和'剔'粒度? – 2010-05-08 04:15:55

+0

你能解釋一下你的約束:「UUID太長了。」?多久太久了? 5個字節,10個字節? – 2010-05-08 04:16:59

+1

您的要求太模糊,無法爲這個問題提供一個很好的答案。 – Stephen 2010-05-08 04:25:38

回答

2

的一種方法是取一唯一的數字或字符串(如隨機UUID)然後計算一個固定長度的摘要(如MD5或SHA-1)和/或在較高的鹼對其進行編碼(如base64)將其進一步縮短。

+0

Java中的Math.abs(java.util.UUID.randomUUID()。toString()。hashCode())會很簡單。這通常會給你一個多位數字,沒有字母。如果你想要一些字母,你可以在十六進制輸出它,但它會更短。並不保證它是唯一的,但將另一個UUID /生成的值作爲數據庫密鑰並將其用作輔助標識符似乎是合理的。您的應用程序也可以通過向用戶提供更多數據(如對象名稱)來處理衝突,並且他們可以選擇正確的數據。 – AngerClown 2010-05-12 18:23:42

0

Git做了類似的事情,它爲提交(和其他事件)生成一個數字,然後用戶可以手動引用這些數字來查找這些提交。他們使用的技巧是,用戶不必輸入整個字符串以找到正確的事件,只需輸入足夠長的字符串,以避免與存儲庫中當前的任何其他提交衝突。一般來說,這隻需要5個左右的十六進制數字來存放相對較大的存儲庫。