Node-AnyID - 万能 ID 生成器

MIT
TypeScript
跨平台
2017-08-19
aleung

在程序里经常都需要生成一些特定格式的 id ,每种场合的需求都可能有些不一样,虽然写起来代码不复杂,但零零碎碎的东西做多了也挺烦的,于是设计了这个用于 node.js 的万能 ID 生成器。

AnyID 生成的 ID 为字符串(也可以纯数字),信息密度尽可能的高,也就是用最少的位数表示尽量多的信息。

AnyID 设计的首要考虑原则是 API 的直观易用。看看这些例子:

指定长度,随机值填充

21 个字符,包含大写小写字母和数字。 这个 ID 的碰撞可能性跟 type 4 (random) UUID 一样低。

const ids = anyid().encode('Aa0').length(21).random()
const id  = ids.id();
1LrKcmd0uk1Ma8szUxtda

多个分段

第一段根据进程号生成,第二段根据时间生成。

const ids = anyid()
  .encode('0A-IO')
  .section( anyid().fixed(process.pid) )
  .delimiter('-')
  .section( anyid().time() );

生成的 ID 是阅读友好的:排除了字母 I 和 O 因为容易和数字 1和 0混淆。

008CL-00TYMZS0P3

自增序列,指定位(bit)长度

这是生成 Twitter Snowflake 风格的 ID ,包含了时间, 序列号和 worker 标识。

const ids = anyid()
  .encode('0')
  .bit(41).time().since(new Date('2016-7-1'))
  .bit(12).seq().resetByTime();
  .bit(10).fix(workerId);

为了节省位空间,微秒时间从 2016-7-1 算起。

071243223959339218

函数值

每次生成 ID 时调用函数获得返回值。第一段是秒,第二段是纳秒。

const nanotime = () => {
  return process.hrtime()[1];
};

const ids = anyid()
  .encode('Aa0')
  .section( anyid().time('s') )
  .delimiter('+')
  .section( anyid().of(nanotime) );
BlX6bX+j3Uz0

参数绑定

第一二段的值在调用时通过传入参数给出

const ids = anyid()
  .encode('Aa0')
  .section( anyid().variable('countryId') )
  .delimiter('-')
  .section( anyid().variable('userId') )
  .delimiter('-')
  .section( anyid().length(5).random() );

const id = ids.id({ countryId: 86, userId: 635023 });
AAABY-ACpMT-EBwQJ
加载中

评论(0)

暂无评论

暂无资讯

暂无讨论

npm update -g

andy@AndyMacBookPro:/usr/local/github/lantern$ sudo npm update -g Password: /usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js - ansi@0.3.0 node_modules/npm/no...

2015/11/09 18:17
12
0
java红黑树的例子

红黑树是一种经典的数据结构,在linux内存管理、nginx 等很多地方用到它。主要操作包括插入、删除,其中插入6种情况,删除8种情况,详细的思路就不说了,如果不太明白的请参考算法导论13章,...

2016/09/23 11:22
31
0
哈希表算法实现

 环境: 主机:WINXP 开发环境:MINGW 说明: 本程序建立的哈希表示意图: 哈希函数为对哈希表长取余 源代码: [cpp] view plain copy /****************************************************...

2015/04/09 11:48
18
0
snmp 系统oid 和厂商对应关系

由于不同厂商的snmp采集实现不一致,因此当我们通过snmp协议来访问设备的时候往往需要区分这个设备的类型、设备厂商、系列号等从而来确定使用哪种具体的采集实现!

2015/07/09 10:53
552
0
l两个排序好的链表生成一个排序链表

/* * 把两个排序好的链表,组合成一个链表,不能破坏原来的链表; *如果非要把List写成类,那么需要在类中有一个遍历类元素的iterator *还是写成面向操作简单一些,当然,下一步就写成类; */ ...

2012/09/13 10:20
28
0
2016.05.11

刷题第6天

2016/05/13 22:36
2
2
avltree、bstree、rbtree和Splaytree

具体参考:https://github.com/nfs-ganesha/nfs-ganesha ``` /* * libtree.h - this file is part of Libtree. * * Copyright (C) 2010 Franck Bui-Huu * * This library is free software; ...

2015/08/10 11:14
83
0
[Hadoop][笔记]4个节点搭建Hadoop2.x HA测试集群

# 搭建Hadoop2.x HA ## 1.机器准备 虚拟机 4台 10.211.55.22 node1 10.211.55.23 node2 10.211.55.24 node3 10.211.55.25 node4 ## 2.四台主机节点安排 |node | namenode | datanode|zk|zkf...

2016/08/22 15:26
52
0
2016.05.14

刷题第8天

2016/05/15 18:44
3
2

没有更多内容

加载失败,请刷新页面

返回顶部
顶部