| /* |
| * 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 org.apache.cassandra.utils; |
| |
| import java.nio.ByteBuffer; |
| import java.util.UUID; |
| |
| /** |
| * The goods are here: www.ietf.org/rfc/rfc4122.txt. |
| */ |
| public class UUIDGen |
| { |
| public static final int UUID_LEN = 16; |
| |
| /** creates a type 1 uuid from raw bytes. */ |
| public static UUID getUUID(ByteBuffer raw) |
| { |
| return new UUID(raw.getLong(raw.position()), raw.getLong(raw.position() + 8)); |
| } |
| |
| public static ByteBuffer toByteBuffer(UUID uuid) |
| { |
| ByteBuffer buffer = ByteBuffer.allocate(UUID_LEN); |
| buffer.putLong(uuid.getMostSignificantBits()); |
| buffer.putLong(uuid.getLeastSignificantBits()); |
| buffer.flip(); |
| return buffer; |
| } |
| |
| /** decomposes a uuid into raw bytes. */ |
| public static byte[] decompose(UUID uuid) |
| { |
| long most = uuid.getMostSignificantBits(); |
| long least = uuid.getLeastSignificantBits(); |
| byte[] b = new byte[16]; |
| for (int i = 0; i < 8; i++) |
| { |
| b[i] = (byte)(most >>> ((7-i) * 8)); |
| b[8+i] = (byte)(least >>> ((7-i) * 8)); |
| } |
| return b; |
| } |
| |
| /** |
| * Returns a milliseconds-since-epoch value for a type-1 UUID. |
| * |
| * @param uuid a type-1 (time-based) UUID |
| * @return the number of milliseconds since the unix epoch |
| * @throws IllegalArgumentException if the UUID is not version 1 |
| */ |
| public static long getAdjustedTimestamp(UUID uuid) |
| { |
| if (uuid.version() != 1) |
| throw new IllegalArgumentException("incompatible with uuid version: "+uuid.version()); |
| return (uuid.timestamp() / 10000) + TimeUUID.UUID_EPOCH_UNIX_MILLIS; |
| } |
| |
| } |
| |
| // for the curious, here is how I generated START_EPOCH |
| // Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT-0")); |
| // c.set(Calendar.YEAR, 1582); |
| // c.set(Calendar.MONTH, Calendar.OCTOBER); |
| // c.set(Calendar.DAY_OF_MONTH, 15); |
| // c.set(Calendar.HOUR_OF_DAY, 0); |
| // c.set(Calendar.MINUTE, 0); |
| // c.set(Calendar.SECOND, 0); |
| // c.set(Calendar.MILLISECOND, 0); |
| // long START_EPOCH = c.getTimeInMillis(); |