/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.jini.core.lookup; import java.io.Serializable; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; /** * A universally unique identifier (UUID) for registered services. * A service ID is a 128-bit value. Service IDs are normally intended to * either be built into services at manufacture or deployment time, or * generated dynamically by lookup services at registration time. <p> * * The most significant long can be decomposed into the following * unsigned fields: * <pre> * 0xFFFFFFFF00000000 time_low * 0x00000000FFFF0000 time_mid * 0x000000000000F000 version * 0x0000000000000FFF time_hi * </pre> * The least significant long can be decomposed into the following * unsigned fields: * <pre> * 0xC000000000000000 variant * 0x3FFF000000000000 clock_seq * 0x0000FFFFFFFFFFFF node * </pre> * The variant field must be 0x2. The version field must be either 0x1 or 0x4. * If the version field is 0x4, then the remaining fields are set to values * produced by a cryptographically secure random sequence. If the version * field is 0x1, then the node field is set to an IEEE 802 address, the * clock_seq field is set to a 14-bit random number, and the time_low, * time_mid, and time_hi fields are set to the least, middle and most * significant bits (respectively) of a 60-bit timestamp measured in * 100-nanosecond units since midnight, October 15, 1582 UTC. * * @author Sun Microsystems, Inc. * @since 1.0 */ public final class ServiceID implements Serializable { private static final long serialVersionUID = -7803375959559762239L; /** * The most significant 64 bits. * * @serial */ private final long mostSig; /** * The least significant 64 bits. * * @serial */ private final long leastSig; /** * Simple constructor. * * @param mostSig the most significant 64 bits * @param leastSig the lease significant 64 bits */ public ServiceID(long mostSig, long leastSig) { this.mostSig = mostSig; this.leastSig = leastSig; } /** * Reads in 16 bytes in standard network byte order. * * @param in the input stream to read 16 bytes from * @throws IOException if there is a problem * reading the most and least significant bits */ public ServiceID(DataInput in) throws IOException { this.mostSig = in.readLong(); this.leastSig = in.readLong(); } /** Returns the most significant 64 bits of the service ID. * * @return a <tt>long</tt> representing the most significant bits value */ public long getMostSignificantBits() { return mostSig; } /** Returns the least significant 64 bits of the service ID. * * @return a <tt>long</tt> representing the least significant bits value */ public long getLeastSignificantBits() { return leastSig; } /** * Writes out 16 bytes in standard network byte order. * * @param out the output stream to which 16 bytes should be written * @throws IOException if there is a problem writing the bytes */ public void writeBytes(DataOutput out) throws IOException { out.writeLong(mostSig); out.writeLong(leastSig); } public int hashCode() { return (int)((mostSig >> 32) ^ mostSig ^ (leastSig >> 32) ^ leastSig); } /** * Service IDs are equal if they represent the same 128-bit value. */ public boolean equals(Object obj) { if (!(obj instanceof ServiceID)) return false; ServiceID sid = (ServiceID)obj; return (mostSig == sid.mostSig && leastSig == sid.leastSig); } /** * Returns a 36-character string of five fields separated by hyphens, with * each field represented in lowercase hexadecimal with the same number of * digits as in the field. The order of fields is: <code>time_low</code>, * <code>time_mid</code>, <code>version</code> and <code>time_hi</code> * treated as a single field, <code>variant</code> and * <code>clock_seq</code> treated as a single field, and <code>node</code>. */ public String toString() { return (digits(mostSig >> 32, 8) + "-" + digits(mostSig >> 16, 4) + "-" + digits(mostSig, 4) + "-" + digits(leastSig >> 48, 4) + "-" + digits(leastSig, 12)); } /** Returns val represented by the specified number of hex digits. */ private static String digits(long val, int digits) { long hi = 1L << (digits * 4); return Long.toHexString(hi | (val & (hi - 1))).substring(1); } }