]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.api.uuid/src/org/argeo/api/uuid/MacAddressUuidFactory.java
Experiment with package-based make
[lgpl/argeo-commons.git] / org.argeo.api.uuid / src / org / argeo / api / uuid / MacAddressUuidFactory.java
1 package org.argeo.api.uuid;
2
3 import java.net.InetAddress;
4 import java.net.NetworkInterface;
5 import java.net.SocketException;
6 import java.net.UnknownHostException;
7 import java.util.UUID;
8
9 /**
10 * An {@link UUID} factory whose node id (for time based UUIDs) is the hardware
11 * MAC address as specified in RFC4122.
12 *
13 * @see https://datatracker.ietf.org/doc/html/rfc4122.html#section-4.1.6
14 */
15 public class MacAddressUuidFactory extends ConcurrentUuidFactory {
16 public final static UuidFactory DEFAULT = new MacAddressUuidFactory();
17
18 public MacAddressUuidFactory() {
19 this(0);
20 }
21
22 public MacAddressUuidFactory(long initialClockRange) {
23 super(initialClockRange, localHardwareAddressAsNodeId());
24 }
25
26 public static byte[] localHardwareAddressAsNodeId() {
27 InetAddress localHost;
28 try {
29 localHost = InetAddress.getLocalHost();
30 NetworkInterface nic = NetworkInterface.getByInetAddress(localHost);
31 return hardwareAddressToNodeId(nic);
32 } catch (UnknownHostException | SocketException e) {
33 throw new IllegalStateException(e);
34 }
35
36 }
37
38 public static byte[] hardwareAddressToNodeId(NetworkInterface nic) throws SocketException {
39 byte[] hardwareAddress = nic.getHardwareAddress();
40 final int length = 6;
41 byte[] arr = new byte[length];
42 for (int i = 0; i < length; i++) {
43 arr[i] = hardwareAddress[length - 1 - i];
44 }
45 return arr;
46 }
47
48 }