读书人

自各儿动手实现主键生成器之一:基于42

发布时间: 2012-08-07 14:54:49 作者: rapoo

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



读书人网 >软件架构设计

热点推荐