content: 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;
    }
  }
  