什么是雪花算法:
SnowFlake是Twitter公司采用的一種算法,目的是在分布式系統(tǒng)中產(chǎn)生全局唯一且趨勢遞增的ID
具有的特點(diǎn):
雪花算法在分布式架構(gòu)很常見,他的分布式id具有的特點(diǎn):
1.全局唯一性:不能出現(xiàn)有重復(fù)的ID標(biāo)識
2.遞增性:確保生成ID對于用戶或業(yè)務(wù)是遞增的
3.高可用性:確保任何時(shí)候都能生成正確的ID
4.高性能性:在高并發(fā)的環(huán)境下依然表現(xiàn)良好
原理:
雪花算法是將一個(gè)64位的整數(shù)分成三個(gè)部分:
1.41個(gè)比特位表示生成ID時(shí)的時(shí)間戳(精確到毫秒),所以理論上可以使用69年腋妙。
2.10個(gè)比特位表示當(dāng)前機(jī)器的編號等太,所以理論上可以支持1024臺機(jī)器栋操。
3.12個(gè)比特位表示當(dāng)前時(shí)間戳下已生成的雪花ID數(shù)量僵腺,所以理論上一毫秒內(nèi)可以產(chǎn)生4096個(gè)不同的ID衡查。
php實(shí)現(xiàn)代碼
public static function createID(){
? ? //假設(shè)一個(gè)機(jī)器id
? ? $machineId = 1234567890;
? ? //41bit timestamp(毫秒)
? ? $time = floor(microtime(true) * 1000);
? ? //0bit 未使用
? ? $suffix = 0;
? ? //datacenterId? 添加數(shù)據(jù)的時(shí)間
? ? $base = decbin(pow(2,40) - 1 + $time);
? ? //workerId? 機(jī)器ID
? ? $machineid = decbin(pow(2,9) - 1 + $machineId);
? ? //毫秒類的計(jì)數(shù)
? ? $random = mt_rand(1, pow(2,11)-1);
? ? $random = decbin(pow(2,11)-1 + $random);
? ? //拼裝所有數(shù)據(jù)
? ? $base64 = $suffix.$base.$machineid.$random;
? ? //將二進(jìn)制轉(zhuǎn)換int
? ? $base64 = bindec($base64);
? ? $id = sprintf('%.0f', $base64);
? ? return $id;
}