携程Apollo参考MongoDB的实现
package com.ctrip.framework.apollo.core.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.NetworkInterface;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.security.SecureRandom;
import java.util.Enumeration;
/**
* @author Jason Song(song_s@ctrip.com)
*/
public class MachineUtil {
private static final Logger logger = LoggerFactory.getLogger(MachineUtil.class);
private static final int MACHINE_IDENTIFIER = createMachineIdentifier();
public static int getMachineIdentifier() {
return MACHINE_IDENTIFIER;
}
/**
* Get the machine identifier from mac address
*
* @see <a href=https://github.com/mongodb/mongo-java-driver/blob/master/bson/src/main/org/bson/types/ObjectId.java>ObjectId.java</a>
*/
private static int createMachineIdentifier() {
// build a 2-byte machine piece based on NICs info
int machinePiece;
try {
StringBuilder sb = new StringBuilder();
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
if (e != null){
while (e.hasMoreElements()) {
NetworkInterface ni = e.nextElement();
sb.append(ni.toString());
byte[] mac = ni.getHardwareAddress();
if (mac != null) {
ByteBuffer bb = ByteBuffer.wrap(mac);
try {
sb.append(bb.getChar());
sb.append(bb.getChar());
sb.append(bb.getChar());
} catch (BufferUnderflowException shortHardwareAddressException) { //NOPMD
// mac with less than 6 bytes. continue
}
}
}
}
machinePiece = sb.toString().hashCode();
} catch (Throwable ex) {
// exception sometimes happens with IBM JVM, use random
machinePiece = (new SecureRandom().nextInt());
logger.warn(
"Failed to get machine identifier from network interface, using random number instead",
ex);
}
return machinePiece;
}
}