背景:在互联网应用中,应用须要为每个用户分配一个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