自己动手实现主键生成器之一:基于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
83S
20
52
4
84T
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");}}