背景:在互聯網應用中,應用須要爲每個用戶分配一個id,在使用分佈式數據庫狀況下,已經不能依靠自增主鍵來生成惟一性id了。。。html
例如經過用戶註冊的email+salt,使用摘要算法(md5/sha)生成128bit的數據,而後經過混合因子轉變爲一個long類型的數據是64bit,有264 個可用數據,理論上衝突概率極低,優勢:可用保證id固定的,每次經過email登陸,直接能獲得id,不須要訪問數據庫查詢id。java
使用每一個服務器環境中的以下參數:算法
1. 服務器網卡MAC地址/IP地址(確保服務器之間不衝突)
2. 每一個生成ID的程序的惟一編號(確保同一服務器上的不一樣服務之間不衝突)
3. 程序每次啓動的惟一編號(確保程序的每次啓停之間不衝突)
4. 啓動後內存裏的序列號/系統當前時間(確保程序的一次運行期內不衝突)數據庫
以及其餘的參數,混合生成id,保證多臺服務器、多個線程生成的id不衝突。數組
例如:服務器
UUID.randomUUID().toString() 生成的是length=32的16進制格式的字符串,若是回退爲byte數組共16個byte元素,即UUID是一個128bit長的數字,通常用16進製表示。算法的核心思想是結合機器的網卡、當地時間、一個隨即數來生成UUID。從理論上講,若是一臺機器每秒產生10000000個GUID,則能夠保證(機率意義上)3240年不重複dom
例如:Instagram 的ID生成策略[翻譯]分佈式
http://www.cnblogs.com/yjl49/archive/2012/04/16/2452210.htmlui
Twitter的 Snowflake---一個使用Apache ZooKeeper來整合全部節點而後生成64bit惟一ID的簡潔的服務。java實現spa
http://www.zuidaima.com/code/file/896737710621696.htm?dir=/896737710621696.java
是由(時間+應用的workId+應用的內存的sequence)生成
隨機生成13位絕對無重複隨機數的高效方法--這個須要數據庫支持,會由於數據庫存在瓶頸
http://www.cnblogs.com/wenhuisun/archive/2011/12/22/2297490.html