All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.itranswarp.warpdb.util.IdUtils Maven / Gradle / Ivy

There is a newer version: 6.0.3
Show newest version
package com.itranswarp.warpdb.util;

import java.util.Random;
import java.util.concurrent.atomic.AtomicLong;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Generate a 16-char String id that composed by: "timestamp-incr".
 * 
 * @author michael
 */
public class IdUtils {

	static final Log log = LogFactory.getLog(IdUtils.class);

	static final char[] BASE32_CHARS = "0123456789abcdefghijklmnopqrstuv".toCharArray();

	static final AtomicLong sequence = new AtomicLong(System.currentTimeMillis() & 0x1fffffff);

	static final Random random = new Random();

	/**
	 * Generate a 16-char String id that composed by:
	 * 
	 * timestamp: 9-chars; seq: 7-chars
	 * 
	 * @return 16-char String.
	 */
	public static String next() {
		String timestamp = longToBase32(System.currentTimeMillis());
		String seq = longToBase32(sequence.getAndIncrement() & 0x1fffffff);
		StringBuilder builder = new StringBuilder("0000000000000000");
		setStringAt(builder, 0, timestamp, 9);
		setStringAt(builder, 9, seq, 7);
		return builder.toString();
	}

	static void setStringAt(StringBuilder buffer, int bufferStart, String str, int length) {
		int strStart = 0;
		int strEnd = str.length();
		if (str.length() < length) {
			// str="ff", length=5:
			bufferStart = bufferStart + (length - str.length());
			strEnd = str.length();
		} else {
			// str="f1c2d3", length=3:
			strStart = str.length() - length;
		}
		for (int i = bufferStart, n = strStart; n < strEnd; i++, n++) {
			buffer.setCharAt(i, str.charAt(n));
		}
	}

	/**
	 * Is string a valid 16-char id.
	 * 
	 * @param s
	 *            Id string.
	 * @return true if it is a 16-char id.
	 */
	public static boolean isValidId(String s) {
		if (s == null || s.length() != 16) {
			return false;
		}
		for (int i = 0; i < 15; i++) {
			char ch = s.charAt(i);
			if (ch >= 'a' && ch <= 'v') {
				continue;
			}
			if (ch >= '0' && ch <= '9') {
				continue;
			}
			return false;
		}
		return true;
	}

	static String longToBase32(long n) {
		char[] buffer = new char[13];
		for (int i = 12; i >= 0; i--) {
			int x = (int) (n & 0x1f);
			buffer[i] = BASE32_CHARS[x];
			n = n >> 5;
			if (n == 0) {
				return new String(buffer, i, 13 - i);
			}
		}
		return new String(buffer);
	}

	public static void main(String[] args) throws Exception {
		for (int i = 0; i < 100; i++) {
			System.out.println(next());
		}
		Thread.sleep(1);
		for (int i = 0; i < 100; i++) {
			System.out.println(next());
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy