看來一下雪花算法的實現方法,用 c++試著實現了一下,這里僅僅是實現了算法的流程,但是具體的細節,如并發、多線程訪問等等沒有具體考慮。
雪花算法的簡單講解參考
#include <sys/select.h>
#include <iostream>
#include <chrono>
#include <random>
#include <ctime>
using namespace std;// 有序且全局唯一的 idlong long getTimeStamp() {return chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now().time_since_epoch()).count();
}// sleep 1ms
void sleep_ms(unsigned int ms) {struct timeval time;time.tv_sec = ms / 1000;time.tv_usec = (ms / 1000) % 1000000;select(0, NULL, NULL, NULL, &time);
}long long getNextMsTimeStamp() {sleep_ms(1);return getTimeStamp();
}long long getMachineId() {default_random_engine e;e.seed(getTimeStamp());return e() % 1024;
}long long lastTimeStamp = getTimeStamp();
long long sequence = 0;
long long sequenceMask = 0b111111111111;long long getSnowflaksUid() {// 一位標識符,表示正負long long identifier = 0;// 41位時間戳,69年long long timeStamp = getTimeStamp();// 十位工作機器位 1024 節點long long machine = getMachineId();if (lastTimeStamp == timeStamp) {// 獲取當前時間戳,如果等于上次時間戳(同一毫秒內),則序列號加一;否則序列號賦值為0,從0開始sequence = (sequence + 1) & (sequenceMask); if (sequence == 0) {timeStamp = getNextMsTimeStamp();}} else {sequence = 0;}lastTimeStamp = timeStamp;return (timeStamp << 22) | (machine << 12) | sequence;
}int main() {cout << getSnowflaksUid() << endl;return 0;
}
關注我的微信公眾號