平时项目中只要涉及表,那么一定能接触到众多各式各样的ID编号,博主整理一些常用的ID格式,整合一个ID生成工具类,供大家参考,如果有什么不足指出,烦请留言批评指正,尽量改正,感激不尽。

目前包括ID生成规则:

  • 根据时间获取编号
  • 根据时间+机器码+后面累加的位数组成的编号
  • 根据时间+机器码+后面随机数组成的编号
  • 根据前缀+累加位数
  • 根据前缀+时间
  • 根据后缀+累加位数
  • 根据后缀+时间

简单的使用方法:

1
2
3
4
5
6
public static void main(String[] args) {
IDUtil idUtil = new IDUtil("yyyyMMddHHmmssSSS");//yyyy-MM-dd HH:mm:ss:SSS
for (int i = 0; i < 10; i++) {
System.out.println(idUtil.generatedNoByFormatDateAndRandom(5,"5"));
}
}

时间格式在创建对象时传入。在集群中使用应传入机器码或唯一标识作为唯一ID的根据。


更新
添加了多个可选的构造方法,来适应不同的生成规则。


IDUtil:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
public class IDUtil {

private SimpleDateFormat sfd = new SimpleDateFormat("yyyyMMddHHmmssSSS");
private Set<Integer> randomSet = new HashSet<Integer>();
private String dateFlag;
private int sequence;

/**
* 初始化 默认
* @return
* @throws
* @author Surpass
* @date 2021/6/15 16:45
*/
public IDUtil() {
this.sfd = new SimpleDateFormat("yyyyMMddHHmmssSSS");
this.dateFlag = this.sfd.format(new Date());
this.sequence = 0;
}

/**
* 初始化
* @param format 时间格式 yyyyMMddHHmmssSSS
* @return
* @throws
* @author Surpass
* @date 2021/6/15 16:45
*/
public IDUtil(String format) {
this.sfd = new SimpleDateFormat(format);
this.dateFlag = this.sfd.format(new Date());
this.sequence = 0;
}

/**
* 初始化
* @param sequence 开始累加数字
* @return
* @throws
* @author Surpass
* @date 2021/6/15 16:45
*/
public IDUtil(int sequence) {
this.sequence = sequence;
}

public String generatedNoByFormatDate(){
return this.generatedNoByFormatDate(null);
}

public String generatedNoByFormatDateAndNum(int digits){
return this.generatedNoByFormatDateAndNum(digits, null);
}

public String generatedNoByFormatDateAndRandom(int randomDigits){
return this.generatedNoByFormatDateAndRandom(randomDigits, null);
}

public String generatedNoByPrefix(String prefix, int digits){
return this.generatedNoByPrefix(prefix, digits, null);
}

public String generatedNoByDateAndPrefix(String prefix){
return this.generatedNoByDateAndPrefix(prefix, null);
}

public String generatedNoBySuffix(String suffix, int digits){
return this.generatedNoBySuffix(suffix, digits, null);
}

public String generatedNoByDateAndSuffix(String suffix){
return this.generatedNoByDateAndSuffix(suffix, null);
}

/**
* 根据时间获取编号
* @param machine 机器码
* @return java.lang.String
* @throws
* @author Surpass
* @date 2021/6/15 16:46
*/
public String generatedNoByFormatDate(String machine){
String formatDate = this.sfd.format(new Date());
if (Objects.nonNull(machine)){
return formatDate + machine;
}
return formatDate;
}

/**
* 根据时间+机器码+后面累加的位数组成的编号
* @param machine 机器码
* @param digits 累加值的位数
* @return java.lang.String
* @throws
* @author Surpass
* @date 2021/6/15 16:46
*/
public String generatedNoByFormatDateAndNum(int digits, String machine){
String no = "";
String formatDate = this.sfd.format(new Date());

if (this.dateFlag.equals(formatDate)){
this.sequence ++;
}else {
this.sequence = 0;
}

if (Objects.nonNull(machine)){
no = formatDate + machine + String.format("%0"+digits+"d", this.sequence);
}else {
no = formatDate + String.format("%0"+digits+"d", this.sequence);
}

return no;
}

/**
* 根据时间+机器码+后面随机数组成的编号
* @param machine 机器码
* @param randomDigits 随机数的位数
* @return java.lang.String
* @throws
* @author Surpass
* @date 2021/6/15 16:46
*/
public String generatedNoByFormatDateAndRandom(int randomDigits, String machine){
String no = "";
String formatDate = this.sfd.format(new Date());
StringBuffer sb = new StringBuffer("9");
for (int i = 1; i < randomDigits; i++) {
sb.append("9");
}
Random random = new Random();

//判断是不是在同一个时间段 不是则修改时间标签和清空随机数Set
if (!this.dateFlag.equals(formatDate)){
this.dateFlag = formatDate;
randomSet.clear();
}

//判断生成的随机数是不是已经呗用过,如果是则重新生成
int randomNum = 0;
do {
randomNum = random.nextInt(Integer.valueOf(sb.toString()));
}while (this.randomSet.contains(randomNum));
randomSet.add(randomNum);

if (Objects.nonNull(machine)){
no = formatDate + machine + String.format("%0"+randomDigits+"d", randomNum);
}else {
no = formatDate + String.format("%0"+randomDigits+"d", randomNum);
}
return no;
}

/**
* 根据前缀+累加位数
* @param prefix 前缀
* @param machine 机器码(可省略)
* @param digits 随机数的位数
* @return java.lang.String
* @throws
* @author Surpass
* @date 2021/6/15 16:46
*/
public String generatedNoByPrefix(String prefix, int digits, String machine){
String no = "";
this.sequence ++;

if (Objects.nonNull(machine)){
no = prefix + machine + String.format("%0"+digits+"d", this.sequence);
}else {
no = prefix + String.format("%0"+digits+"d", this.sequence);
}
return no;
}

/**
* 根据前缀+时间
* @param prefix 后缀
* @param machine 机器码(可省略) null
* @return java.lang.String
* @throws
* @author Surpass
* @date 2021/6/15 16:46
*/
public String generatedNoByDateAndPrefix(String prefix, String machine){
String no = "";
String formatDate = this.sfd.format(new Date());

if (Objects.nonNull(machine)){
no = prefix + formatDate + machine;
}else {
no = prefix + formatDate;
}
return no;
}

/**
* 根据后缀+累加位数
* @param suffix 后缀
* @param machine 机器码(可省略) null
* @param digits 随机数的位数
* @return java.lang.String
* @throws
* @author Surpass
* @date 2021/6/15 16:46
*/
public String generatedNoBySuffix(String suffix, int digits, String machine){
String no = "";
this.sequence ++;

if (Objects.nonNull(machine)){
no = machine + String.format("%0"+digits+"d", this.sequence) + suffix;
}else {
no = String.format("%0"+digits+"d", this.sequence) + suffix;
}
return no;
}

/**
* 根据后缀+时间
* @param suffix 后缀
* @param machine 机器码(可省略) null
* @return java.lang.String
* @throws
* @author Surpass
* @date 2021/6/15 16:46
*/
public String generatedNoByDateAndSuffix(String suffix, String machine){
String no = "";
String formatDate = this.sfd.format(new Date());

if (Objects.nonNull(machine)){
no = formatDate + machine + suffix;
}else {
no = formatDate + suffix;
}
return no;
}
}