c++雪花id 实现
时间: 2023-08-17 22:03:56 浏览: 67
C++实现雪花ID的方法如下:
```c++
#include <chrono>
#include <iostream>
#include <random>
class SnowFlakeIDGenerator {
public:
SnowFlakeIDGenerator(uint64_t worker_id) : worker_id_(worker_id) {}
uint64_t GenerateID() {
std::lock_guard<std::mutex> lock(mutex_);
uint64_t timestamp = GetTimestamp();
if (timestamp == last_timestamp_) {
sequence_ = (sequence_ + 1) & kSequenceMask;
if (sequence_ == 0) {
// Sequence overflow, wait until next millisecond.
timestamp = WaitNextMillis(last_timestamp_);
}
} else {
sequence_ = 0;
}
last_timestamp_ = timestamp;
return (timestamp << kTimestampShift) |
(worker_id_ << kWorkerIdShift) |
sequence_;
}
private:
uint64_t GetTimestamp() {
auto now = std::chrono::system_clock::now();
auto duration = now.time_since_epoch();
auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(duration);
return static_cast<uint64_t>(millis.count());
}
uint64_t WaitNextMillis(uint64_t last_timestamp) {
uint64_t timestamp = GetTimestamp();
while (timestamp <= last_timestamp) {
timestamp = GetTimestamp();
}
return timestamp;
}
static const uint64_t kTimestampBits = 41;
static const uint64_t kWorkerIdBits = 10;
static const uint64_t kSequenceBits = 12;
static const uint64_t kMaxWorkerId = (1 << kWorkerIdBits) - 1;
static const uint64_t kMaxSequence = (1 << kSequenceBits) - 1;
static const uint64_t kTimestampShift = kWorkerIdBits + kSequenceBits;
static const uint64_t kWorkerIdShift = kSequenceBits;
static const uint64_t kSequenceMask = kMaxSequence;
uint64_t worker_id_;
uint64_t last_timestamp_ = 0;
uint64_t sequence_ = 0;
std::mutex mutex_;
};
int main() {
SnowFlakeIDGenerator generator(1);
for (int i = 0; i < 10; ++i) {
std::cout << generator.GenerateID() << std::endl;
}
return 0;
}
```
上面的代码实现了一个基于雪花算法的ID生成器,其中`worker_id`为每个生成器的唯一标识。在生成ID时,先获取当前时间戳,然后判断是否与上一次生成ID时的时间戳相同,如果相同,则将序列号加1,如果序列号溢出,则等待下一毫秒再生成ID;否则,将序列号重置为0。最后,将时间戳、worker_id和序列号合并成一个64位整数作为最终的ID。
相关推荐
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)