js生成唯一id_ecp-uid唯一ID生成器

ecp-uid

b5923449eb185ecc19af572284b96daf.png

居于美团leaf、百度UidGenerator、原生snowflake 进行整合的 唯一ID生成器

一、介绍

1、本项目为uid生成器,支持segment、snowflake、UidGenerator、spring四种策略生成id

2、本项目可生成混淆id,目前混淆策略为:gene(基因法)

3、项目地址: github : https://github.com/linhuaichuan/ecp-uid 码云: https://gitee.com/zmds/ecp-uid

二、策略说明

1、snowflake snowflake 是基于Twitter snowflake 算法的优化策略 本策略优化了闰秒回拨处理、新增默认workId 与 datacenterId 的提供方法。

2、baidu 是 基于百度UidGenerator上的的优化策略。

 (1)、workerId提供策略 * DisposableWorkerIdAssigner,利用数据库来管理生成workId,依赖数据库和spring-jdbc框架(需有jdbcTemplate的bean)。mysql表示例:DROP TABLE IF EXISTS WORKER_NODE;CREATE TABLE WORKER_NODE (ID BIGINT NOT NULL AUTO_INCREMENT COMMENT '自增 id',HOST_NAME VARCHAR(64) NOT NULL COMMENT '主机名',PORT VARCHAR(64) NOT NULL COMMENT '端口',TYPE INT NOT NULL COMMENT '节点类型: ACTUAL or CONTAINER',LAUNCH_DATE DATE NOT NULL COMMENT '启动时间',MODIFIED TIMESTAMP NOT NULL COMMENT '修改时间',CREATED TIMESTAMP NOT NULL COMMENT '创建时间',PRIMARY KEY(ID)) COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB; 示例:... * SimpleWorkerIdAssigner ,固定了workId的提供。值为0.示例:  * ZkWorkerIdAssigner ,利用zookeeper来实现wordId的提供管理,依赖原生Zookeeper驱动.示例:可设置interval-心跳间隔、pidHome-workerId文件存储目录、zkAddress-zk地址、pidPort-心跳端口  * RedisWorkIdAssigner ,利用redis来实现wordId的提供管理,依赖了spring-data-redis框架的RedisTemplate.示例:可设置interval-心跳间隔、pidHome-workerId文件存储目录、pidPort-心跳端口 (2)、uid生成策略 * DefaultUidGenerator 是Snowflake算法的变种,取消datacenterId, 并扩展了支持自定义workerId位数和初始化策略。 a、可配置 delta seconds (28 bits)  当前时间,相对于时间基点"2016-05-20"的增量值,单位:秒,最多可支持约8.7年 b、worker id (22 bits)  机器id,最多可支持约420w次机器启动。内置实现为在启动时由数据库分配,默认分配策略为用后即弃,后续可提供复用策略。 c、sequence (13 bits)  每秒下的并发序列,13 bits可支持每秒8192个并发。  注: 三者之和为63  示例:   * CachedUidGenerator借用未来时间来解决sequence天然存在的并发限制; 采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费, 同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题. 最终单机QPS可达600万 示例:   (3)、比特分配的建议 *对于并发数要求不高、期望长期使用的应用, 可增加```timeBits```位数, 减少```seqBits```位数.  例如节点采取用完即弃的WorkerIdAssigner策略, 重启频率为12次/天, 那么配置成```{"workerBits":23,"timeBits":31,"seqBits":9}```时, 可支持28个节点以整体并发量14400 UID/s的速度持续运行68年. *对于节点重启频率频繁、期望长期使用的应用, 可增加```workerBits```和```timeBits```位数, 减少```seqBits```位数. 例如节点采取用完即弃的WorkerIdAssigner策略, 重启频率为24*12次/天, 那么配置成```{"workerBits":27,"timeBits":30,"seqBits":6}```时, 可支持37个节点以整体并发量2400 UID/s的速度持续运行34年.

3、segment 是 基于美团leaf-segment 的优化策略, 使用双Buffer实现。依赖数据库与spring-jdbc框架

 (1)、SegmentServiceImpl 是具体实现类,数据库表结构为(mysql示例): DROP TABLE IF EXISTS id_segment; CREATE TABLE id_segment (BIZ_TAG VARCHAR(64) NOT NULL COMMENT '业务标识',STEP int NOT NULL COMMENT '步长',MAX_ID BIGINT NOT NULL COMMENT '最大值',LAST_UPDATE_TIME TIMESTAMP NOT NULL COMMENT '上次修改时间',CURRENT_UPDATE_TIME TIMESTAMP NOT NULL COMMENT '当前修改时间',PRIMARY KEY(BIZ_TAG) ) COMMENT='号段存储表',ENGINE = INNODB;  (2)、支持 同步/异步两种更新数据库方式。可选配置asynLoadingSegment(true-异步,false-同步),默认使用异步。 示例: ...

4、spring 增量ID 是 基于 segment策略提供给spring 增量实现。非直接使用的策略

5、混淆算法 是 基于 基因分库法这个理论扩展出来的混淆算法

三 、使用

 
int main(int argc, char *argv[]) { ec_param *ecp; sm2_ec_key *key_B; message_st message_data; int type = TYPE_GFp; int point_bit_length = 256; char **sm2_param = sm2_param_recommand; ecp = ec_param_new(); ec_param_init(ecp, sm2_param, type, point_bit_length); key_B = sm2_ec_key_new(ecp); sm2_ec_key_init(key_B, sm2_param_d_B[ecp->type], ecp); memset(&message_data, 0, sizeof(message_data)); sm2_hex2bin((BYTE *)sm2_param_k[ecp->type], message_data.k, ecp->point_byte_length); sm2_bn2bin(key_B->d, message_data.private_key, ecp->point_byte_length); sm2_bn2bin(key_B->P->x, message_data.public_key.x, ecp->point_byte_length); sm2_bn2bin(key_B->P->y, message_data.public_key.y, ecp->point_byte_length); message_data.decrypt = (BYTE *)OPENSSL_malloc(message_data.message_byte_length + 1); memset(message_data.decrypt, 0, message_data.message_byte_length + 1); BIGNUM *P_x; BIGNUM *P_y; //BIGNUM *d; BIGNUM *k; xy_ecpoint *P; xy_ecpoint *xy1; xy_ecpoint *xy2; int pos1; BYTE t; int i; sm2_hash local_C_3; P_x = BN_new(); P_y = BN_new(); k = BN_new(); P = xy_ecpoint_new(ecp); xy1 = xy_ecpoint_new(ecp); xy2 = xy_ecpoint_new(ecp); BN_bin2bn(message_data.public_key.x, ecp->point_byte_length, P_x); BN_bin2bn(message_data.public_key.y, ecp->point_byte_length, P_y); BN_bin2bn(message_data.k, ecp->point_byte_length, k); xy_ecpoint_init_xy(P, P_x, P_y, ecp); xy_ecpoint_mul_bignum(xy1, ecp->G, k, ecp); xy_ecpoint_mul_bignum(xy2, P, k, ecp); char cryptstring[1024]; scanf("%s", cryptstring); / 利用函数sm2_hex2bin将16进制字符串cryptstring转换成二进制流填充到message_data.C里 / / 计算明文长度 message_data.message_byte_length */ message_data.klen_bit = message_data.message_byte_length * 8;(请根据注释补充)
05-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值