uid生成方面
1:為什么用雪花算法
分布式ID的唯一性需要保證,同時需要做到
1:單調遞增
2:確保安全,一個是要能體現出遞增的單號,二一個不能輕易的被惡意爬出訂單數量
3:含有時間戳
4:高可用,低延遲
5:高QPS
2:雪花算法構成
0(符號位)41位(bits)的時間戳10位機器碼12位序列號,可以根據時間戳長短調整。
時間戳記錄的是毫秒數,最多表示69年。機器碼可以確保在多個服務器上生成ID的唯一性,如果跨機房部署,可以把10位拆成5位機房id+5位機器id。10個比特最多1024個機器。序列號是在時間相同是生成不同標識的,同一毫秒可以產生4096的ID。
3:時間回撥問題
沒問到,但是可以了解。
回撥時間小的時候,不生成ID,循環等待時間點到達。
或者給拓展位+1,或者在序列號中騰出一部分位置來標識。
美團和百度有解決的方案嗎,美團的leaf-snowflake:以“1+41+10+12”的方式組裝ID號,改動點為:將SnowFlake從本地jar包變成了獨立服務,并引入了Zookeeper來解決時鐘回撥問題
4:別的算法
百度UidGenerator是Java實現的,基于Snowflake算法的唯一ID生成器。UidGenerator以組件形式工作在應用項目中, 支持自定義workerId位數和初始化策略。
UUID:通用唯一識別碼。標準是32位的16進制數字,本地生成不依賴別的。但是不易存儲,長度太長,同時uuid無序,信息生成的時候基于MAC地址生成也可能暴露使用者的位置。
數據庫自增:設置步長
Redis實現:提供INCR或INCRBY這種自增原子命令,通過Redis單線程保證唯一性
MD5算法:用加鹽算法實現,加鹽算法意思是每個人在做菜的時候都會放不同的鹽,因此代表不重復的標識,可以通過UUID來實現,然后MD5算法就可以通過UUID+密碼來生成。
但MD5一是不支持分布式,同時已經在04年被破解了,可以采用更好的sha-256算法