自各儿动手实现主键生成器之一:基于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");
	}
}