@lupnfer
2017-04-11T11:12:35.000000Z
字数 2020
阅读 859
Code
def make_snowflake(timestamp_ms, datacenter_id, worker_id, sequence_id, twepoch=twepoch):"""generate a twitter-snowflake id, based onhttps://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala:param: timestamp_ms time since UNIX epoch in milliseconds"""sid = ((int(timestamp_ms) - twepoch) % max_timestamp) << datacenter_id_bits << worker_id_bits << sequence_id_bitssid += (datacenter_id % max_datacenter_id) << worker_id_bits << sequence_id_bitssid += (worker_id % max_worker_id) << sequence_id_bitssid += sequence_id % max_sequence_idreturn sid#snowflake 生成contentt0 = int(time.time() * 1000)dentialsInfo.strCredentials_content = make_snowflake(t0, 1, 2, 3)
uuid.h
#ifndef __UTIL_UUID_H__#define __UTIL_UUID_H__#include <stdint.h>namespace utils{// twitter snowflake算法// 64 63--------------22---------12---------0// 符号位 | 41位时间 |10位机器码|12位自增码|extern uint64_t get_time();class unique_id_t{public:unique_id_t();~unique_id_t();void set_epoch(uint64_t epoch);void set_machine(int32_t machine);int64_t generate();private:uint64_t epoch_;uint64_t time_;int32_t machine_;int32_t sequence_;};}#endif // !__UTIL_UUID_H__
#include "uuid.h"#include <sys/time.h>#include <unistd.h>#define EPOCHFILETIME 11644473600000000ULLnamespace utils{uint64_t get_time(){struct timeval tv;gettimeofday(&tv, NULL);uint64_t time = tv.tv_usec;time /= 1000;time += (tv.tv_sec * 1000);return time;}unique_id_t::unique_id_t(){epoch_ = 0;time_ = 0;machine_ = 0;sequence_ = 0;}unique_id_t::~unique_id_t(){}void unique_id_t::set_epoch(uint64_t epoch){epoch_ = epoch;}void unique_id_t::set_machine(int32_t machine){machine_ = machine;}int64_t unique_id_t::generate(){int64_t value = 0;uint64_t time = get_time() - epoch_;// 保留后41位时间value = time << 22;// 中间10位是机器IDvalue |= (machine_ & 0x3FF) << 12;// 最后12位是sequenceIDvalue |= sequence_++ & 0xFFF;if (sequence_ == 0x1000){sequence_ = 0;}return value;}}#include <iostream>int main(){utils::unique_id_t* u_id_ptr = new utils::unique_id_t();u_id_ptr->set_epoch(uint64_t(1367505795100));u_id_ptr->set_machine(int32_t(100));for (int i = 0; i < 1024; ++i){std::cout << u_id_ptr->generate() << std::endl;;}return 0;}