@@ -0,0 +1,3238 @@
+/*%0A * The MIT License (MIT)%0A *%0A * Copyright (c) 2016 Lachlan Dowding%0A *%0A * Permission is hereby granted, free of charge, to any person obtaining a copy%0A * of this software and associated documentation files (the %22Software%22), to deal%0A * in the Software without restriction, including without limitation the rights%0A * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell%0A * copies of the Software, and to permit persons to whom the Software is%0A * furnished to do so, subject to the following conditions:%0A *%0A * The above copyright notice and this permission notice shall be included in all%0A * copies or substantial portions of the Software.%0A *%0A * THE SOFTWARE IS PROVIDED %22AS IS%22, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR%0A * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,%0A * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE%0A * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER%0A * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,%0A * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE%0A * SOFTWARE.%0A */%0A%0Apackage permafrost.tundra.id;%0A%0A/**%0A * A Java implementation of ULID, as per https://github.com/alizain/ulid.%0A */%0Apublic class ULID %7B%0A    /**%0A     * Table of characters used to base32-encode the ULID time and random components.%0A     */%0A    private static final char%5B%5D ENCODE_TABLE = %7B%0A        '0','1','2','3','4','5','6','7','8','9',%0A        'A','B','C','D','E','F','G','H','J','K',%0A        'M','N','P','Q','R','S','T','V','W','X',%0A        'Y','Z'%0A    %7D;%0A    /**%0A     * The number of characters in the ULID devoted to the time component.%0A     */%0A    private static final int TIME_LENGTH = 10;%0A    /**%0A     * The number of characters in the ULID devoted ot the random component.%0A     */%0A    private static final int RANDOM_LENGTH = 16;%0A    /**%0A     * The buffer into which the ULID is generated.%0A     */%0A    private StringBuilder buffer = new StringBuilder();%0A%0A    /**%0A     * Constructs a new ULID.%0A     */%0A    private ULID() %7B%0A        encodeRandom();%0A        encodeTime();%0A    %7D%0A%0A    /**%0A     * Encode the current time into this ULID's string buffer.%0A     */%0A    private void encodeTime() %7B%0A        long time = System.currentTimeMillis();%0A%0A        for (int i = 0; i %3C TIME_LENGTH; i++) %7B%0A            int mod = (int)(time %25 ENCODE_TABLE.length);%0A            time = (time - mod) / ENCODE_TABLE.length;%0A            buffer.append(ENCODE_TABLE%5Bmod%5D);%0A        %7D%0A    %7D%0A%0A    /**%0A     * Encodes a randomness component into this ULID's string buffer.%0A     */%0A    private void encodeRandom() %7B%0A        for (int i = 0; i %3C RANDOM_LENGTH; i++) %7B%0A            int rand = (int)(Math.floor(ENCODE_TABLE.length * Math.random()));%0A            buffer.append(ENCODE_TABLE%5Brand%5D);%0A        %7D%0A    %7D%0A%0A    /**%0A     * Returns the string representation of this ULID.%0A     *%0A     * @return The string representation of this ULID.%0A     */%0A    @Override%0A    public String toString() %7B%0A        return buffer.reverse().toString();%0A    %7D%0A%0A    /**%0A     * Returns a newly generated ULID.%0A     *%0A     * @return A newly generated ULID.%0A     */%0A    public static String generate() %7B%0A        return new ULID().toString();%0A    %7D%0A%7D%0A

Add ULID implementation class