Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * UUIDGen.java
   *
   * Created on 09.08.2003.
   *
   * eaio: UUID - an implementation of the UUID specification
   * Copyright (c) 2003-2009 Johann Burkard (jb@eaio.com) http://eaio.com.
   *
   * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  * and/or sell copies of the Software, and to permit persons to whom the
  * Software is furnished to do so, subject to the following conditions:
  *
  * The above copyright notice and this permission notice shall be included
  * in all copies or substantial portions of the Software.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
  */
 package base.uuid;
 
 import java.io.File;
This class contains methods to generate UUID fields. These methods have been refactored out of UUID.

Starting with version 2, this implementation tries to obtain the MAC address of the network card. Under Microsoft Windows, the ifconfig command is used which may pop up a command window in Java Virtual Machines prior to 1.4 once this class is initialized. The command window is closed automatically.

The MAC address code has been tested extensively in Microsoft Windows, Linux, Solaris 8, HP-UX 11, but should work in MacOS X and BSDs, too.

If you use JDK 6 or later, the code in java.net.InterfaceAddress will be used.

Author(s):
Johann Burkard
See also:
UUID
UUID
 
 public final class UUIDGen {

No instances needed.
 
 	private UUIDGen() {
 		super();
 	}

The last time value. Used to remove duplicate UUIDs.
 
 	private static long lastTime = .;

The cached MAC address.
 
 	private static String macAddress = null;

The current clock and node value.
 
 	private static long clockSeqAndNode = 0x8000000000000000L;
 
 	static {
 
 		try {
 			Class.forName("java.net.InterfaceAddress");
 			 = Class.forName(
 					"com.eaio.uuid.UUIDGen$HardwareAddressLookup").newInstance().toString();
 		}
 		catch (ExceptionInInitializerError err) {
 			// Ignored.
 		}
 		catch (ClassNotFoundException ex) {
 			// Ignored.
 		}
 		catch (LinkageError err) {
 			// Ignored.
 		}
 		catch (IllegalAccessException ex) {
			// Ignored.
		}
		catch (InstantiationException ex) {
			// Ignored.
		}
		catch (SecurityException ex) {
			// Ignored.
		}
		if ( == null) {
			Process p = null;
			BufferedReader in = null;
			try {
				String osname = System.getProperty("os.name"""), osver = System.getProperty("os.version""");
				if (osname.startsWith("Windows")) {
					p = Runtime.getRuntime().exec(
							new String[] { "ipconfig""/all" }, null);
				}
				// Solaris code must appear before the generic code
				else if (osname.startsWith("Solaris")
						|| osname.startsWith("SunOS")) {
					if (osver.startsWith("5.11")) {
						p = Runtime.getRuntime().exec(
								new String[] { "dladm""show-phys""-m" }, null);
					}
					else {
						String hostName = getFirstLineOfCommand("uname""-n");
						if (hostName != null) {
							p = Runtime.getRuntime().exec(
									new String[] { "/usr/sbin/arp"hostName },
									null);
						}
					}
				}
				else if (new File("/usr/sbin/lanscan").exists()) {
					p = Runtime.getRuntime().exec(
							new String[] { "/usr/sbin/lanscan" }, null);
				}
				else if (new File("/sbin/ifconfig").exists()) {
					p = Runtime.getRuntime().exec(
							new String[] { "/sbin/ifconfig""-a" }, null);
				}
				if (p != null) {
							p.getInputStream()), 128);
					String l = null;
					while ((l = in.readLine()) != null) {
						 = MACAddressParser.parse(l);
						if ( != null
								&& Hex.parseShort() != 0xff) {
							break;
						}
					}
				}
			}
			catch (SecurityException ex) {
				// Ignore it.
			}
			catch (IOException ex) {
				// Ignore it.
			}
			finally {
				if (p != null) {
					if (in != null) {
						try {
							in.close();
						}
						catch (IOException ex) {
							// Ignore it.
						}
					}
					try {
					}
					catch (IOException ex) {
						// Ignore it.
					}
					try {
					}
					catch (IOException ex) {
						// Ignore it.
					}
				}
			}
		}
		if ( != null) {
		}
		else {
			try {
				byte[] local = InetAddress.getLocalHost().getAddress();
				 |= (local[0] << 24) & 0xFF000000L;
				 |= (local[1] << 16) & 0xFF0000;
				 |= (local[2] << 8) & 0xFF00;
				 |= local[3] & 0xFF;
			}
			catch (UnknownHostException ex) {
				 |= (long) (Math.random() * 0x7FFFFFFF);
			}
		}
		// Skip the clock sequence generation process and use random instead.
		 |= (long) (Math.random() * 0x3FFF) << 48;
	}

Returns the current clockSeqAndNode value.

Returns:
the clockSeqAndNode value
See also:
UUID.getClockSeqAndNode()
	public static long getClockSeqAndNode() {
	}

Generates a new time field. Each time field is unique and larger than the previously generated time field.

Returns:
a new time value
See also:
UUID.getTime()
	public static long newTime() {
		return createTime(System.currentTimeMillis());
	}

Creates a new time field from the given timestamp. Note that even identical values of currentTimeMillis will produce different time fields.

Parameters:
currentTimeMillis the timestamp
Returns:
a new time value
See also:
UUID.getTime()
	public static synchronized long createTime(long currentTimeMillis) {
		long time;
		// UTC time
		long timeMillis = (currentTimeMillis * 10000) + 0x01B21DD213814000L;
		if (timeMillis > ) {
			 = timeMillis;
		}
		else {
			timeMillis = ++;
		}
		// time low
		time = timeMillis << 32;
		// time mid
		time |= (timeMillis & 0xFFFF00000000L) >> 16;
		// time hi and version
		time |= 0x1000 | ((timeMillis >> 48) & 0x0FFF); // version 1
		return time;
	}

Returns the MAC address. Not guaranteed to return anything.

Returns:
the MAC address, may be null
	public static String getMACAddress() {
		return ;
	}

Returns the first line of the shell command.

Parameters:
commands the commands to run
Returns:
the first line of the command
Throws:
java.io.IOException
	static String getFirstLineOfCommand(String... commandsthrows IOException {
		Process p = null;
		BufferedReader reader = null;
		try {
			p = Runtime.getRuntime().exec(commands);
			reader = new BufferedReader(new InputStreamReader(
					p.getInputStream()), 128);
			return reader.readLine();
		}
		finally {
			if (p != null) {
				if (reader != null) {
					try {
						reader.close();
					}
					catch (IOException ex) {
						// Ignore it.
					}
				}
				try {
				}
				catch (IOException ex) {
					// Ignore it.
				}
				try {
				}
				catch (IOException ex) {
					// Ignore it.
				}
			}
		}
	}

Scans MAC addresses for good ones.
	static class HardwareAddressLookup {

		public String toString() {
			String out = null;
			try {
				if (ifs != null) {
					while (ifs.hasMoreElements()) {
						NetworkInterface iface = ifs.nextElement();
						byte[] hardware = iface.getHardwareAddress();
						if (hardware != null && hardware.length == 6
								&& hardware[1] != (byte) 0xff) {
							out = Hex.append(new StringBuilder(36), hardware).toString();
							break;
						}
					}
				}
			}
			catch (SocketException ex) {
				// Ignore it.
			}
			return out;
		}
	}
New to GrepCode? Check out our FAQ X