代码不是自己写的。 收集而来!
第一套
package com
.utils
;
import java
.lang
.management
.ManagementFactory
;
import java
.net
.InetAddress
;
import java
.net
.NetworkInterface
;
public final class IdWorker {
private final static long TWEPOCH
= 1288834974657L
;
private final static long WORKER_ID_BITS
= 5L
;
private final static long DATA_CENTER_ID_BITS
= 5L
;
private final static long MAX_WORKER_ID
= ~(-1L
<< WORKER_ID_BITS
);
private final static long MAX_DATA_CENTER_ID
= ~(-1L
<< DATA_CENTER_ID_BITS
);
private final static long SEQUENCE_BITS
= 12L
;
private final static long WORKER_ID_SHIFT
= SEQUENCE_BITS
;
private final static long DATA_CENTER_ID_SHIFT
= SEQUENCE_BITS
+ WORKER_ID_BITS
;
private final static long TIME_STAMP_LEFT_SHIFT
= SEQUENCE_BITS
+ WORKER_ID_BITS
+ DATA_CENTER_ID_BITS
;
private final static long SEQUENCE_MASK
= ~(-1L
<< SEQUENCE_BITS
);
private static long LAST_TIME_STAMP
= -1L
;
private long sequence
= 0L
;
private final long workerId
;
private final long DATA_CENTER_ID
;
public IdWorker() {
this.DATA_CENTER_ID
= getDatacenterId(MAX_DATA_CENTER_ID
);
this.workerId
= getMaxWorkerId(DATA_CENTER_ID
, MAX_WORKER_ID
);
}
public IdWorker(long workerId
, long datacenterId
) {
if (workerId
> MAX_WORKER_ID
|| workerId
< 0) {
throw new IllegalArgumentException(String
.format("id不能大于最大值 %d 或者小于 0", MAX_WORKER_ID
));
}
if (datacenterId
> MAX_DATA_CENTER_ID
|| datacenterId
< 0) {
throw new IllegalArgumentException(String
.format("数据中心id不能大于最大值 %d 或者小于 0", MAX_DATA_CENTER_ID
));
}
this.workerId
= workerId
;
this.DATA_CENTER_ID
= datacenterId
;
}
public synchronized long nextId() {
long timestamp
= timeGen();
if (timestamp
< LAST_TIME_STAMP
) {
throw new RuntimeException(String
.format("时间生成异常 %d", LAST_TIME_STAMP
- timestamp
));
}
if (LAST_TIME_STAMP
== timestamp
) {
sequence
= (sequence
+ 1) & SEQUENCE_MASK
;
if (sequence
== 0) {
timestamp
= tilNextMillis(LAST_TIME_STAMP
);
}
} else {
sequence
= 0L
;
}
LAST_TIME_STAMP
= timestamp
;
return ((timestamp
- TWEPOCH
) << TIME_STAMP_LEFT_SHIFT
)
| (DATA_CENTER_ID
<< DATA_CENTER_ID_SHIFT
)
| (workerId
<< WORKER_ID_SHIFT
) | sequence
;
}
private long tilNextMillis(final long lastTimestamp
) {
long timestamp
= this.timeGen();
while (timestamp
<= lastTimestamp
) {
timestamp
= this.timeGen();
}
return timestamp
;
}
private long timeGen() {
return System
.currentTimeMillis();
}
private static long getMaxWorkerId(long dataCenterId
, long maxWorkerId
) {
StringBuilder mpid
= new StringBuilder();
mpid
.append(dataCenterId
);
String name
= ManagementFactory
.getRuntimeMXBean().getName();
if (!name
.isEmpty()) {
mpid
.append(name
.split("@")[0]);
}
return (mpid
.toString().hashCode() & 0xffff) % (maxWorkerId
+ 1);
}
private static long getDatacenterId(long maxDatacenterId
) {
long id
= 0L
;
try {
InetAddress ip
= InetAddress
.getLocalHost();
NetworkInterface network
= NetworkInterface
.getByInetAddress(ip
);
if (network
== null
) {
id
= 1L
;
} else {
byte[] mac
= network
.getHardwareAddress();
id
= ((0x000000FF & (long) mac
[mac
.length
- 1])
| (0x0000FF00 & (((long) mac
[mac
.length
- 2]) << 8))) >> 6;
id
= id
% (maxDatacenterId
+ 1);
}
} catch (Exception e
) {
System
.out
.println(" getDatacenterId: " + e
.getMessage());
}
return id
;
}
public static synchronized String
generateId() {
String id
= String
.valueOf(new IdWorker().nextId());
return id
;
}
public static void main(String
[] args
) {
System
.out
.println("当前时间戳:" + System
.currentTimeMillis());
for (int i
= 0; i
< 10; i
++) {
String id
= IdWorker
.generateId();
System
.out
.println("第" + i
+ "个:" + id
+ ";长度为:" + id
.length());
}
}
}
第二套
package com
.utils
;
import org
.apache
.commons
.lang3
.RandomUtils
;
import org
.apache
.commons
.lang3
.StringUtils
;
import org
.apache
.commons
.lang3
.SystemUtils
;
import java
.net
.Inet4Address
;
import java
.net
.UnknownHostException
;
public class SnowflakeIdWorker {
private final long twepoch
= 1288834974657L
;
private final long workerIdBits
= 5L
;
private final long dataCenterIdBits
= 5L
;
private final long maxWorkerId
= -1L
^ (-1L
<< workerIdBits
);
private final long maxDataCenterId
= -1L
^ (-1L
<< dataCenterIdBits
);
private final long sequenceBits
= 12L
;
private final long workerIdShift
= sequenceBits
;
private final long dataCenterIdShift
= sequenceBits
+ workerIdBits
;
private final long timestampLeftShift
= sequenceBits
+ workerIdBits
+ dataCenterIdBits
;
private final long sequenceMask
= -1L
^ (-1L
<< sequenceBits
);
private long workerId
;
private long dataCenterId
;
private long sequence
= 0L
;
private long lastTimestamp
= -1L
;
private static SnowflakeIdWorker idWorker
;
static {
idWorker
= new SnowflakeIdWorker(getWorkId(), getDataCenterId());
}
public SnowflakeIdWorker(long workerId
, long dataCenterId
) {
if (workerId
> maxWorkerId
|| workerId
< 0) {
throw new IllegalArgumentException(String
.format("workerId can't be greater than %d or less than 0", maxWorkerId
));
}
if (dataCenterId
> maxDataCenterId
|| dataCenterId
< 0) {
throw new IllegalArgumentException(String
.format("dataCenterId can't be greater than %d or less than 0", maxDataCenterId
));
}
this.workerId
= workerId
;
this.dataCenterId
= dataCenterId
;
}
public synchronized long nextId() {
long timestamp
= timeGen();
if (timestamp
< lastTimestamp
) {
throw new RuntimeException(
String
.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp
- timestamp
));
}
if (lastTimestamp
== timestamp
) {
sequence
= (sequence
+ 1) & sequenceMask
;
if (sequence
== 0) {
timestamp
= tilNextMillis(lastTimestamp
);
}
}
else {
sequence
= 0L
;
}
lastTimestamp
= timestamp
;
return ((timestamp
- twepoch
) << timestampLeftShift
)
| (dataCenterId
<< dataCenterIdShift
)
| (workerId
<< workerIdShift
)
| sequence
;
}
protected long tilNextMillis(long lastTimestamp
) {
long timestamp
= timeGen();
while (timestamp
<= lastTimestamp
) {
timestamp
= timeGen();
}
return timestamp
;
}
protected long timeGen() {
return System
.currentTimeMillis();
}
private static Long
getWorkId() {
try {
String hostAddress
= Inet4Address
.getLocalHost().getHostAddress();
int[] ints
= StringUtils
.toCodePoints(hostAddress
);
int sums
= 0;
for (int b
: ints
) {
sums
+= b
;
}
return (long) (sums
% 32);
} catch (UnknownHostException e
) {
return RandomUtils
.nextLong(0, 31);
}
}
private static Long
getDataCenterId() {
int[] ints
= StringUtils
.toCodePoints(SystemUtils
.getHostName());
int sums
= 0;
for (int i
: ints
) {
sums
+= i
;
}
return (long) (sums
% 32);
}
public static synchronized String
generateId() {
long longId
= idWorker
.nextId();
String id
= String
.valueOf(longId
);
return id
;
}
public static void main(String
[] args
) {
System
.out
.println(System
.currentTimeMillis());
long startTime
= System
.nanoTime();
for (int i
= 0; i
< 100; i
++) {
String id
= SnowflakeIdWorker
.generateId();
System
.out
.println("第" + i
+ "个:" + id
+ ";长度为:" + id
.length());
}
System
.out
.println((System
.nanoTime() - startTime
) / 1000000 + "ms");
}
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-968.html