UUID (Java)
1. Introduction
TBD
20. Short UUID
Generating UUIDs using and then translating them to base57 using lowercase and uppercase letters and digits, and removing similar-looking characters such as l, 1, I, O and 0.
Reference: defensefinalwork
Encoded UUIDs have 22 characters, eg:
UUID ShortUuid
--------------------------------------------------------------
b898a7ce-96c6-4ff9-a84b-69b3492ec1ff fkzEZpZU9VdvuQh6Eeo6ra
ec6dc62c-3f93-477f-8cd0-f3535333096b UoGiH549ghxuaJBhxCQk5k
20.1. Usage
//New shortUuid
String shortUuid = (new ShortUuid.Builder()).build().toString();
//UUID to shortUuid
UUID uuid = UUID.randomUUID();
String shortUuid = (new ShortUuid.Builder()).build(uuid).toString();
//shortUuid to UUID
UUID uuid = UUID.fromString((new ShortUuid.Builder()).decode(shortUuid)));
20.2. Code
The following code is based in the one by hsingh at https://github.com/hsingh/java-shortuuid from 2015-nov-8.
The issue "Padding length is wrong" has been fixed replacing Math.log(25d) by Math.log(256d).
ShortUuid.java
package com.hsingh.shortuuid;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.UUID;
/**
* A short, unambiguous and URL-safe UUID
*
* @author Harpreet Singh
*/
public final class ShortUuid {
private final String uuid;
private ShortUuid(String uuid) {
this.uuid = uuid;
}
@Override
public String toString() {
return uuid;
}
@Override
public int hashCode() {
return uuid.hashCode();
}
@Override
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof ShortUuid))
return false;
return ((ShortUuid) o).toString().equals(uuid);
}
public static class Builder {
private char[] alphabet = "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
.toCharArray();
private int alphabetSize = alphabet.length;
public Builder() {}
public Builder alphabet(String alphabet) {
this.alphabet = alphabet.toCharArray();
Arrays.sort(this.alphabet);
alphabetSize = this.alphabet.length;
return this;
}
public ShortUuid build() {
return build(UUID.randomUUID());
}
public ShortUuid build(UUID uuid) {
String uuidStr = uuid.toString().replaceAll("-", "");
Double factor = Math.log(256d) / Math.log(alphabetSize);
Double length = Math.ceil(factor * 16);
BigInteger number = new BigInteger(uuidStr, 16);
String encoded = encode(number, alphabet, length.intValue());
return new ShortUuid(encoded);
}
public String decode(String shortUuid) {
return decode(shortUuid.toCharArray(), alphabet);
}
private String encode(final BigInteger bigInt, final char[] alphabet, final int padToLen) {
BigInteger value = new BigInteger(bigInt.toString());
BigInteger alphaSize = BigInteger.valueOf(alphabetSize);
StringBuilder shortUuid = new StringBuilder();
while (value.compareTo(BigInteger.ZERO) > 0) {
BigInteger[] fracAndRemainder = value.divideAndRemainder(alphaSize);
shortUuid.append(alphabet[fracAndRemainder[1].intValue()]);
value = fracAndRemainder[0];
}
if (padToLen > 0) {
int padding = Math.max(padToLen - shortUuid.length(), 0);
for (int i = 0; i < padding; i++)
shortUuid.append(alphabet[0]);
}
return shortUuid.toString();
}
private String decode(final char[] encoded, final char[] alphabet) {
BigInteger sum = BigInteger.ZERO;
BigInteger alphaSize = BigInteger.valueOf(alphabetSize);
int charLen = encoded.length;
for (int i = 0; i < charLen; i++) {
sum = sum.add(alphaSize.pow(i).multiply(BigInteger.valueOf(
Arrays.binarySearch(alphabet, encoded[i]))));
}
String str = sum.toString(16);
// Pad the most significant bit (MSG) with 0 (zero) if the string is too short.
if (str.length() < 32) {
str = String.format("%32s", str).replace(' ', '0');
}
StringBuilder sb = new StringBuilder()
.append(str.substring(0, 8))
.append("-")
.append(str.substring(8, 12))
.append("-")
.append(str.substring(12, 16))
.append("-")
.append(str.substring(16, 20))
.append("-")
.append(str.substring(20, 32));
return sb.toString();
}
}
}
ShortUuidTest.java
package com.hsingh.shortuuid;
import static org.junit.Assert.*;
import java.util.UUID;
import org.junit.Test;
public class ShortUuidTest {
public String[][] getTests() {
return new String[][] {
{"c3eeb3e6-e577-4de2-b5bb-08371196b453", "nSKHvGZM4M5A4KyN4zp4sc"},
{"7c37b0a5-9d63-4d91-a79e-85a480fd2348", "gos3umowEP9bS8QAGSuk7Q"},
{"52600a3d-a12a-4041-aa9c-afd5e5923a70", "ZHhWmgrdXxgMqzgYRXGRfG"},
{"7b80853c-a9f3-4acd-b735-17d29b3b9122", "gGpmQT6oVMVeQvnLkgJWyP"},
{"2f56ebd5-373f-478f-afab-1142b74b75bc", "Hi7d4MYcbjKxzeg8YiN7SA"},
{"72573478-ade8-4a6c-a583-d098e9c24de3", "yoANdrf88xUXvwbS5GRbMN"},
{"f4c03714-aa7e-42e3-91f8-9a7a3bc05f75", "VTtAQPXV7MRyAghQPA6AZm"},
{"f9ee01c3-2015-4716-930e-4d5449810833", "7fm8A5kT3j9j5M2HcjofUn"},
{"a5fb9251-9373-486b-b9bd-ecf1c7cc6d9c", "DQqWKCLAjsm6fTTFCwuKYX"},
{"9cbfe3da-dc50-4d07-9d3a-3d161e5a82b1", "dhRv9nyctV3M6uUJtcZgtV"},
{"cda34e96-188b-41b2-acac-05cd288c32e1", "Cekw67uyMpBGZLRP2HFVbe"},
{"0ce70d9e-830e-404b-8b56-25cc611eed6a", "qXPoF8kNjxoqWZVCnoXrJ4"},
{"36a06807-8c07-4e65-8b99-855b3628c155", "LXuzZwRWpEYos2yAiDmziB"},
{"4672c1dc-125a-4469-a81e-c69dc3b8f792", "p6tjrWt5UH9RpAUqPfjTYE"},
{"e63d7da2-7f8d-4954-9c2d-d46b324d10f2", "P3bYrwnrsvRXdsRCTByyxi"},
{"926251a7-41a3-4029-bf44-bf860e881423", "r3FdNDkxMf4rdz8V7dcZ4U"},
{"464a919f-54e9-435e-a029-a3b942b07134", "THvwuXRQt9soLzL3L2zrWE"},
{"7c24ef71-f4eb-4000-afb6-710c7f9e0942", "9tXMVg3xaJxwuK7v4XZ27Q"},
{"d3973d0f-22e4-44b5-a03f-34a57458a8ff", "rqcFhGVXy7quTXiERRPref"},
{"74102102-3d04-48fc-b2b5-6ef50109e27f", "v8tx4KDUXyfSFcSmFZ45fN"},
{"67cdb44b-f0fb-47c1-9060-025216c14067", "nD4n6pXuc9BanbiQM6HjUL"},
{"503c91b0-6a52-4b26-be71-b96c1d4d908b", "fq2q5eoUmgGuuKTtCa3jHG"},
{"174ea6fa-9321-4e80-b732-006b11998663", "zw3YBp3erLmWGWFvNW8PA6"},
{"fa60d3a9-df24-468c-8006-e2a4f37ddf17", "zohky26otniDxSonDD6EZn"},
{"eff670a0-75f5-4458-afd4-9aa442dcc507", "feViSxBJPp7ZUgCA2hCbhk"},
{"2c301095-3f99-4fc8-88e3-a2be83fd39fc", "YAJdktpVp9ioZXyerGS9s9"},
{"ee2d3de2-4ad7-4f32-9071-f8aa4b46dc0b", "XrKarC8cp4dWSRnWQjoUPk"},
{"12942a1b-cf39-44d6-bfbb-0ae17affd408", "tYx4TiGiu78HcFfkmgkRK5"},
{"f9b2ea09-32c6-426b-bb3b-a269182e99f3", "b7rFanuSDdkVW4Af7vNLSn"},
{"02f3da16-b995-445a-877b-2319f0c06b41", "5aQC5t9BRRcicH9GbfmwX2"},
{"b8538991-0957-4bab-93f3-7f78ca9c1550", "vDJmAtHGFpqmrP6MNTjMoa"},
{"3bf87639-ba74-463e-9455-bf7bcb8fd898", "4pUYNRFHTG3YVgThPZvCgC"},
{"c9c7cafa-a131-4193-a21d-b65d0052f77b", "ziGxvYy3dYbecxB2VPNNud"},
{"f921ebe3-2d1b-42fc-951b-7b275d5a1e5f", "pwt3bwxM4WTMGRqNTuxaLn"},
{"c3d5e2c5-1bc8-4a86-96fb-bf0877c9fc03", "UNqNwmt3Eb9TDXRJXon5rc"},
{"582dd24f-beda-42cf-b751-7c7e9827b7d1", "cjhuJfBhZQiSZ7GkYPGHhH"},
{"6dfacd19-5cfd-4b95-92be-7e9fb0fe343e", "C6wrxXg46LWXAnhNTyVNaM"},
{"ea3f3050-d7ce-4ad7-ae24-9b7b164dcec1", "r29MuyWbYNZ75FhWmh5dgj"},
{"07dcc180-1323-4985-8359-296261dd53c8", "Qw7DZuPhurJbWAAGwhwjQ3"},
{"89ffb519-4cea-4cd2-b051-0da7b451ca1a", "q7C7JQRar8QxqhkePNRXZS"},
{"81fa1f63-389e-44ae-906d-4c1f4a715a61", "mQVvJQHRPinBYydtDaHB9R"},
{"77eee831-5e48-400b-b1e1-31bc8d28876e", "hnGWZSNK7xyhivxQoYJKMP"},
{"63815548-e46f-441a-8bdf-3153db75e56b", "Qnmrn7WRTv2kmDC5oNZ9iK"},
{"60cba957-dc15-404a-994a-cab6b11b1315", "po3Y5UByzV7T8ny9fvCfEK"},
{"a23360e0-1caf-4275-b957-0bcd7aa109d8", "mRV85qM4gaVEVidUCrfxrW"},
{"48610926-01fb-4ef8-ae6b-ba9b45569525", "4YcLEHE6evYdnN9R6Er3tE"},
{"c1d07707-c751-4e18-bf53-924a02e7a312", "tfdCPzDgjH7kDZmoUbRaVc"},
{"d22b3035-2213-49a8-8399-a547303f29a3", "9K49a86KhGxzjfdt8YLSQf"},
{"ba40a392-f1f6-4486-8c27-00b78db13ddc", "iHHZerT4hpfGqMbjuXCt9b"},
{"241d6b4e-81a7-439a-896d-b645ec223eb5", "fuTJdCqF7jvgn6p8ZRoGS8"},
{"e2f1fc6f-c8c8-4e6c-91ff-aca0ca558535", "qHhWwrK3ZPHZ3w5LDjHaPi"},
{"b6f1e412-da4f-43bf-8a9f-ae4658f5b9ce", "7EohUgpsHtHugJudodBMZa"},
{"db850c2c-a4e2-45c5-9b67-fda3be319df2", "uAQEWZNR9MQrqTVCU3qG5h"},
{"63ac6e18-e0c9-477d-b08f-039b9538e577", "Qh3dcsgZBQCseB34xNsqjK"},
{"eda9eacb-d698-41af-8790-4f26ecbd3a39", "29XrEqVWgteJF2Kr6xGHJk"},
{"76d61350-f831-40fe-ae88-c2d63885c954", "u6xS5LyehZPedbnBRjACAP"},
{"9dc996f5-2dfb-4e60-96a2-f11f59eb71de", "B8tRdDRCz6spwRDVPoXD6W"},
{"9e0ef764-f98d-4c66-abd8-5d5e7392bacb", "TsnXJsfNMZGvuu9WJHCx8W"},
{"08c79281-f45e-4463-b26d-1dc84ece1a05", "VgbLFBmKXHXs5VZdxuB4a3"},
{"6611ce43-fe22-47ef-879e-de3fbbd4d9f6", "HHsWgxyECxDUUdNKEvu9BL"},
{"748374a4-43c4-42a4-92be-f70daffe5d58", "h6793J2TNezTRPo8iFUdjN"},
{"eb571f9d-dbe4-4d37-840f-0db7c9a35e3a", "snrX2R8WkCAALQ5Ux6Cisj"},
{"dbc3f7d2-5f4b-4fb9-b473-2ca74cf7e2ef", "WRGi6eUnSKwVAaCwcXuk7h"},
{"4e4d65f0-22b1-48ba-acc4-b378e7a826e3", "ybEmP4TsGe53BYtqDAu7wF"},
{"c5232425-c634-4653-a367-0eb07235ccfc", "U6XjtF8PADo2bW7Gd6KH6d"},
{"8a95bedb-0592-4329-87be-8affdf5f2e97", "ck493bWVpcBsppo94mDUfS"},
{"52fa1417-02e9-4656-96ec-5cf44fdcd3c2", "RyF2UdmNpgzbxjNVbo6XmG"},
{"d728fb9b-240b-4ca1-b864-50b807364acb", "y3kctB9VyUVeDABHVQg4Jg"},
{"9da4fb93-9260-46a7-b6df-f04218560fe0", "jxBVLETqKeFjofyJe8sk4W"},
{"fa9c1ef1-1f4d-4b74-9590-878c79f1f353", "xKpbsbfBxJA5r5uC7wxZbn"},
{"64d1355f-d052-4bd9-83f4-39b93fb1c01f", "fCd2nkGhNF9UBcxpDsySwK"},
{"7227d320-fd77-4430-8e9c-ac3f93e07c51", "crnPpyJpmterz6sLUwRiKN"},
{"22eac9a7-b0b7-4c8b-9e88-4a2c4a48eef4", "PKMNKhycsviQJbcG3uQ8E8"},
{"68252941-638b-4e0d-807a-3e8cd04f2493", "iRPfmXvLunFTvtoanekCYL"},
{"3c9886b3-cabc-4854-8fe3-d394c0901830", "ELPAWnjUbWpbS3xhJSNYnC"},
{"37eea0c0-ec18-42e8-a152-c98fee7346fb", "QgZm5asemZJYKqpCJrTFxB"},
{"a61daaac-ea00-4bba-89d9-22b97763a43a", "aCfFqp3vmiADaHuL6LufZX"},
{"1fc9211b-c1b8-464e-ae01-1c59d1972f47", "ENBaEjcoJktWRqfBkVDNf7"},
{"21e24536-3b3e-4166-85c4-c29ea151fbbe", "LNZqphXG6tigmWJeBt7e38"},
{"94fac6e4-315c-4399-89c0-0c5bdd5bf206", "w6qsE9trfLSjwUMjzxzsWU"},
{"e9ae9ba7-4fb1-4a6d-bbca-5315ed438371", "vACGXSMs5eYcfXgAAjbtaj"},
{"39439367-6f10-4de8-883f-7ace28c3bc33", "KSbYQEttmBpDjSkUxEMkCC"},
{"ac6250d9-6e12-4686-98b2-3e5e8ab11ecb", "ZZVXrsGQdVqLz4JGNdKFgY"},
{"f1975e43-a054-4243-85b1-14ed27be8330", "Bb45oofgN75sPKJYWWe7zk"},
{"9206e127-8559-4cc4-877e-5cf342aecd25", "7LppjN8wAobe3FXybT9wyT"},
{"4aeff9a2-4ad2-4c85-abd1-95e798b2132a", "JPu3vSYW3LEGp7RTMSkyLF"},
{"c7c541b0-d024-432e-8b84-dcc011bfb596", "ag4yKsYNczpg2gKA3TWyYd"},
{"852fcc13-5632-4188-92a8-12909c77f83f", "tJusodB6eZxNyVrGXGgihR"},
{"97d87c66-f983-48b7-84c4-1d521e790ecf", "jYFL8gwyq9inicFz4dmw2V"},
{"4f800ff2-7c1a-4305-b7d5-ce4c5b08e928", "wGSD5xRu6Kc9z8PrFsNGAG"},
{"185c8229-dbd0-4fc1-a485-04a0532a71d0", "huiUUTVakc3eBxVmQgU5M6"},
{"0170eb09-dd9d-4682-a58f-b49eb481a40d", "YE6XcuFs8SBnRhgVcS4dG2"},
{"d11c27c7-e302-4007-8a82-a83f57da217a", "uRQsP9P54sbnWjw66uKhDf"},
{"4ef326fe-7886-4054-b427-4cd9f48200bf", "ibgFYZiZccqvy2PrsMCg4G"},
{"9e5366f3-6bb8-42db-b999-1dc3612be8e4", "nWdjqVaVdyt94U794eifBW"},
{"75a8dcb5-9e11-4fbb-895b-60bb6959b6e7", "9tvqGWgZgfiq2mPAvazFwN"},
{"2b3bd265-a475-401d-88a6-3aa8580483ba", "zdGUGgimEzGkL65LnmuTh9"},
{"7273ea84-04a1-4d32-92ff-b0afad3eedb6", "6FBBvgSqZeKBpyxxBfFjNN"},
{"d2af90cd-1b97-4bec-810b-562406b31470", "aTfqZJoFH5kXHiYGxoFgVf"},
{"8ec76efb-b891-4ee4-868d-997597e390e1", "mdoaq3unkSKHuuDKc6gzQT"},
{"431933fb-14dd-411c-8fc6-5ca57fa7979d", "ajLWxEodc6CmQLHADuKVwD"},
{"4788fd99-a1f3-468a-bc67-ada5f80016f4", "QvqUofYurTwpHNWUG52VjE"},
{"502f56e0-f351-4f42-b395-4dde8b8c19b6", "B8tAKsW9Zw6ZRHySjmADHG"},
{"b3150123-4e7c-4080-a029-c7437c6513df", "JYqm5dazak2ye8hfs7DBsZ"},
{"61714a37-a894-4ec5-a569-7e925b46e368", "no6QHS2MfYKUZ6ys4xCEMK"},
{"8a2f74ed-8146-4f86-a50a-aa28a21c3829", "t3HZ5drXDpPRgjuEnBFRbS"},
{"5ea5a1a8-bd7e-46fd-ae88-e2d779bc9453", "uQod4vaUSE3ciZdwbbCsqJ"},
{"35165d02-262d-4e30-8344-c70ee9cc63ee", "DjB4ac8mxbB25FCQswyPTB"},
{"0026636a-e9b3-4a88-9c66-bf49d8cad81f", "BcRZF3N5Bv7FcJTEsxgX32"},
{"84973303-f7ff-47a0-8b47-c54767700622", "kzcnTJSM4nPRXJT89Q7gbR"},
{"92faac68-0387-49ae-a219-45e7c13fd6a3", "Rw8KtoWPAvbt2EqPtAebAU"},
{"e9f17c46-0d3d-45e8-bc36-6c793b59c91c", "QXh7kFCLxJkJjayBAXcYdj"},
{"d39295c8-f4d8-407f-bcdf-d07911f4d997", "tWkeanmnjjupCMcjnUsfef"},
{"a2952f3b-fba2-4926-b19d-26d550093b93", "VEaZCnxWXK6VryEoLUXqvW"},
{"40e86d7b-77dd-4f55-aec8-29262e028c38", "3Ad8xKbmR43ud53T7Y4HZD"},
{"c6876847-fda6-4ab5-a2c2-9d8fe9c543bc", "Bj5frkc73iykq7XVT6nPLd"},
{"cf5c7de8-82d2-475f-a078-825b76d0a287", "PzWDnpB8hSu8cZN38AUxte"},
{"c4560036-bd08-42d6-ba59-1a49a51643df", "zYWYB5k4sQ55k4KL7V6Awc"},
{"ded85fd3-afe7-45a1-a4d8-90c0a5bc8901", "MDkC9BQWzG7RPvHpCGCzeh"},
{"f8221ca8-49e2-44e5-a104-7cec6fb28d48", "Q682Tt3m3ohTTdoGZgLTAn"},
{"c1544cac-c6ee-40a7-98c8-900a7282ae22", "43nxCsa2kHWeAK32kG4fQc"},
{"422a2339-0950-4a68-aec1-8c4056feef2a", "SBxqULeq9wXZskuxLoV2nD"},
{"d9f26801-08d7-42e2-adee-e178944d9ba9", "z2QKKXd38qApcjuav6eKng"},
{"69807fd5-8bcf-4d4c-a534-ff298d4a5a0a", "fe9aUtsDhyC9ssuU2Y5xmL"},
{"65656f1e-ae8d-48a3-825d-4499144eefab", "bGSD7rg3Xm2Y4mjNDygK4L"},
{"0a4399e6-7fad-452b-acc8-1d6b33415019", "NzVFQCNbRxxccPCpHRK7q3"},
{"4860e725-08f5-4ba1-87e6-1db791f183d8", "8Ka6kDcVRxniasWrb8Z3tE"},
{"709a8e5a-6320-4649-b4c2-8aceb28502ae", "ekLbSTDNHj9XSCjo6XNy3N"},
{"3b6aa689-ab23-4ded-932d-090e029a7a99", "4PjpHyzbdreNeUxSc3iaaC"},
{"00302322-9d08-4394-a1ac-b25bbab774d4", "zv3wa6Hm2fK2SaaRLkhu32"},
{"12a12ca0-0d6e-4b84-bd6f-9715d467ae76", "iCLCA6LpyQKnw3TexB9wK5"},
{"6556f0b7-b826-4ed3-b2ef-911a1d0665c8", "RfzKJAwgPxnMD24SEVxj3L"},
{"269ca19c-5937-4512-83f8-ab9ab82cdaab", "nUkCVCrYTu7LBY8eDPCbs8"},
{"58f3c051-a71a-4608-bf4e-543694f65f6b", "kKorfq5sQENdZGWDPuC8qH"},
{"13f0a717-883d-4a69-b7da-eeb91f5d5ca5", "Dke3AiNbfvWUjq6W5bfEZ5"},
{"7d2ec191-96ef-4b3d-834e-94cf60b1467f", "6mVb7WwQ8tcas48qYJoYHQ"},
{"831805c0-7651-4a0d-804e-d12924bb9a0c", "pZ6gS9wWUXdHr64W7jrVLR"},
{"56a03672-74bc-418c-9964-76548fd5b209", "9qiVxV4fEdYvhaW5PBSXRH"},
{"8c634f54-f7bf-4f39-bf84-394f06970eda", "YpGmB2LeJ6ms8jntjgTkyS"},
{"a5d35565-a3e0-407f-ab1c-1b8a605ba172", "9bFhyhbykoBC3mdQcu4jWX"},
{"48443c48-0632-4b72-ba41-f4bdd0cd8ef5", "8ZmSNTgRwuf3qD5ZuLptrE"},
{"1e86f5b0-b479-4dd2-9d3c-0c0b9a63db30", "WbphNvGKPP8bQE9y65jbS7"},
{"7178fac6-27b6-473d-801a-63be24d75fb2", "bTdfo4UL4NWDXoMttdcnCN"},
{"8e03626b-9c23-4032-9ee2-ae6ca661b7d1", "zvvZNCeKsWEQwYrP4dyEHT"},
{"51f7acb3-2a82-4cc6-8601-523ed6d5909b", "EdQ8N465wYULNARFAfbHbG"},
{"676fcb0c-730c-4875-9c0b-62b0bc2f4b9e", "J7DMkkwPsVJnt6frUnD2RL"},
{"2ab244e0-4e34-494f-8c1a-d91051a4c3bf", "E4VoERm26o5Rkfsp6NK2c9"},
{"4c8c949d-5bef-4d56-82f9-2041859b1dc6", "sEsXtdJXEnq9cLJuCrSLdF"},
{"ca887b94-e90a-4143-b498-b0f517677e5a", "bLBXoAmYhoJvTHv2FVUz3e"},
{"eb9ccaea-9569-4688-a40a-96fe3dd3d6eb", "89hHCpRTfBuhi7hxJDWUvj"},
{"00000000-0000-0000-0000-000000000000", "2222222222222222222222"},
};
}
@Test
public void testEncoding() {
ShortUuid.Builder builder = new ShortUuid.Builder();
String[][] tests = getTests();
for (String[] test : tests) {
ShortUuid shortUuid = builder.build(UUID.fromString(test[0]));
assertEquals(test[1], shortUuid.toString());
}
}
@Test
public void testDecoding() {
ShortUuid.Builder builder = new ShortUuid.Builder();
String[][] tests = getTests();
for (String[] test : tests) {
String decodedUuid = builder.decode(test[1]);
assertEquals(test[0], decodedUuid);
}
}
}