@lupnfer
2017-04-11T11:12:35.000000Z
字数 2020
阅读 799
Code
def make_snowflake(timestamp_ms, datacenter_id, worker_id, sequence_id, twepoch=twepoch):
"""generate a twitter-snowflake id, based on
https://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_bits
sid += (datacenter_id % max_datacenter_id) << worker_id_bits << sequence_id_bits
sid += (worker_id % max_worker_id) << sequence_id_bits
sid += sequence_id % max_sequence_id
return sid
#snowflake 生成content
t0 = 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 11644473600000000ULL
namespace 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位是机器ID
value |= (machine_ & 0x3FF) << 12;
// 最后12位是sequenceID
value |= 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;
}