Skip to content

Instantly share code, notes, and snippets.

@avisagie
Created July 14, 2015 17:52
Show Gist options
  • Save avisagie/1af2f24e1aa1d5beb9b0 to your computer and use it in GitHub Desktop.
Save avisagie/1af2f24e1aa1d5beb9b0 to your computer and use it in GitHub Desktop.
uuid ranges in Java using BigInteger
import java.math.BigInteger;
public class TryBigInt {
public static void main(String[] args) {
BigInteger start = new BigInteger("00000000000000000000000000000000", 16);
BigInteger end = new BigInteger("ffffffffffffffffffffffffffffffff", 16);
final long numRanges = 11;
BigInteger jump = (end.subtract(start)).divide(BigInteger.valueOf(numRanges));
for (long ii = 0; ii < numRanges; ii++) {
final BigInteger rangeStart = jump.multiply(BigInteger.valueOf(ii));
final BigInteger rangeEnd;
if (ii < numRanges - 1) {
rangeEnd = rangeStart.add(jump);
} else {
rangeEnd = end;
}
System.out.println(ii + " " + rangeStart.toString(16) + " to " + rangeEnd.toString(16) + " (size = " + String.format("%01.03e", rangeEnd.subtract(rangeStart).doubleValue()) + ")");
// to byte array
byte[] bytesStart = toBytes(rangeStart);
byte[] bytesEnd = toBytes(rangeEnd);
System.out.format("%s -> %s\n", hex(bytesStart), hex(bytesEnd));
}
}
private static String hex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b: bytes) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
}
private static byte[] toBytes(BigInteger x) {
byte[] bytes = x.toByteArray();
if (bytes.length == 16) {
return bytes;
}
// copy least significant 16 bytes
byte[] ret = new byte[16];
for (int ii=0; ii<bytes.length && ii<ret.length; ii++) {
ret[ret.length-1-ii] = bytes[bytes.length-1-ii];
}
return ret;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment