自各儿动手实现主键生成器之一:基于42进位的14编码生成算法
自己动手实现主键生成器之一:基于42进位的14编码生成算法
ASCII码表
代码 |
字符 |
代码 |
字符 |
代码 |
字符 |
代码 |
字符 |
0 |
|
32 |
[空格] |
64 |
@ |
96 |
` |
1 |
|
33 |
! |
65 |
A |
97 |
a |
2 |
|
34 |
" |
66 |
B |
98 |
b |
3 |
|
35 |
# |
67 |
C |
99 |
c |
4 |
|
36 |
$ |
68 |
D |
100 |
d |
5 |
|
37 |
% |
69 |
E |
101 |
e |
6 |
|
38 |
& |
70 |
F |
102 |
f |
7 |
|
39 |
' |
71 |
G |
103 |
g |
8 |
** |
40 |
( |
72 |
H |
104 |
h |
9 |
** |
41 |
) |
73 |
I |
105 |
i |
10 |
** |
42 |
* |
74 |
J |
106 |
j |
11 |
|
43 |
+ |
75 |
K |
107 |
k |
12 |
|
44 |
, |
76 |
L |
108 |
l |
13 |
** |
45 |
- |
77 |
M |
109 |
m |
14 |
|
46 |
. |
78 |
N |
110 |
n |
15 |
|
47 |
/ |
79 |
O |
111 |
o |
16 |
|
48 |
0 |
80 |
P |
112 |
p |
17 |
|
49 |
1 |
81 |
Q |
113 |
q |
18 |
|
50 |
2 |
82 |
R |
114 |
r |
19 |
|
51 |
3 |
83 |
S |
|
|
20 |
|
52 |
4 |
84 |
T |
|
|
21 |
|
53 |
5 |
85 |
U |
|
|
22 |
|
54 |
6 |
86 |
V |
118 |
v |
23 |
|
55 |
7 |
87 |
W |
119 |
w |
24 |
|
56 |
8 |
88 |
X |
120 |
x |
25 |
|
57 |
9 |
89 |
Y |
121 |
y |
26 |
|
58 |
: |
90 |
Z |
122 |
z |
27 |
59 |
; |
91 |
[ |
123 |
{ |
|
28 |
|
60 |
< |
92 |
\ |
124 |
| |
29 |
|
61 |
= |
93 |
] |
125 |
} |
30 |
- |
62 |
> |
94 |
^ |
126 |
~ |
31 |
|
63 |
? |
95 |
_ |
127 |
|
/** * 14位主键生成算法 * 用ASCII码表中48-90中数字和大写字母生成14位的主键 * 48-90共42个字符 采取 42进位的方法 (逢42进位) * 表示的最大数为 42^14个 */ public class BaseCodeCreator { /**最小编码 48也就是数字0*/ private final static byte MIN_CODE = 48; /**最大编码 90也就是数字Z*/ private final static byte MAX_CODE = 90; /**编码长度 */ private final int CODE_LENGTH = 14; /** 14 位编码 */ private byte[] baseCodes = new byte[CODE_LENGTH]; /** * 私有化构造方法 */ private BaseCodeCreator() { } /** * 获得实例 * @return */ synchronized public static BaseCodeCreator getInstance() { BaseCodeCreator oidBase = new BaseCodeCreator(); return oidBase; } /** * 设置初始编码 * @return */ private void setOidBaseCodes(byte[] baseCodes) { if (baseCodes.length != CODE_LENGTH) return; System.arraycopy(baseCodes, 0, this.baseCodes, 0, CODE_LENGTH); } /** * 获得实例 * @return */ public static BaseCodeCreator getInstance(String strOidBase) { BaseCodeCreator oidBase = new BaseCodeCreator(); oidBase.setOidBaseCodes(strOidBase.getBytes()); return oidBase; } /** * 取得下一个 编码 * @return String 下一个编码 */ public String nextCode() { for (int i = baseCodes.length - 1; i >= 0; --i) { byte code = (byte) (baseCodes[i] + 1); boolean carryUp = false; byte newCode = code; if (code > MAX_CODE) { newCode = MIN_CODE; carryUp = true; } // 跳过数字与大写字母之间的其他字符 if (newCode == 58) { newCode = 65; } baseCodes[i] = newCode; if (!carryUp) break; } return new String(baseCodes); } public static void main(String[] args) { BaseCodeCreator gen = BaseCodeCreator.getInstance("10000000000000"); long time = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { String oidBaseCode = gen.nextCode(); System.out.println(oidBaseCode); } System.out.println((System.currentTimeMillis() - time)/1000+"s"); } }