-
-
Save jdcrensh/4670128 to your computer and use it in GitHub Desktop.
| public class Base62 { | |
| public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; | |
| public static final int BASE = ALPHABET.length(); | |
| private Base62() {} | |
| public static String fromBase10(int i) { | |
| StringBuilder sb = new StringBuilder(""); | |
| if (i == 0) { | |
| return "a"; | |
| } | |
| while (i > 0) { | |
| i = fromBase10(i, sb); | |
| } | |
| return sb.reverse().toString(); | |
| } | |
| private static int fromBase10(int i, final StringBuilder sb) { | |
| int rem = i % BASE; | |
| sb.append(ALPHABET.charAt(rem)); | |
| return i / BASE; | |
| } | |
| public static int toBase10(String str) { | |
| return toBase10(new StringBuilder(str).reverse().toString().toCharArray()); | |
| } | |
| private static int toBase10(char[] chars) { | |
| int n = 0; | |
| for (int i = chars.length - 1; i >= 0; i--) { | |
| n += toBase10(ALPHABET.indexOf(chars[i]), i); | |
| } | |
| return n; | |
| } | |
| private static int toBase10(int n, int pow) { | |
| return n * (int) Math.pow(BASE, pow); | |
| } | |
| } |
| import org.junit.Test; | |
| import static junit.framework.Assert.assertEquals; | |
| public class Base62Test { | |
| @Test | |
| public void testCharList() throws Exception { | |
| StringBuilder sb = new StringBuilder(); | |
| for (char c = 'a'; c <= 'z'; c++) { | |
| sb.append(c); | |
| } | |
| for (char c = 'A'; c <= 'Z'; c++) { | |
| sb.append(c); | |
| } | |
| for (int i = 0; i <= 9; i++) { | |
| sb.append(i); | |
| } | |
| assertEquals(sb.toString(), Base62.ALPHABET); | |
| } | |
| @Test | |
| public void testStringFromInt() throws Exception { | |
| int n = 0; | |
| String str = "6JaY2"; | |
| char[] chars = str.toCharArray(); | |
| n += Base62.ALPHABET.indexOf(chars[0]) * (int) Math.pow(62, 4); | |
| n += Base62.ALPHABET.indexOf(chars[1]) * (int) Math.pow(62, 3); | |
| n += Base62.ALPHABET.indexOf(chars[2]) * (int) Math.pow(62, 2); | |
| n += Base62.ALPHABET.indexOf(chars[3]) * (int) Math.pow(62, 1); | |
| n += Base62.ALPHABET.indexOf(chars[4]) * (int) Math.pow(62, 0); | |
| assertEquals(str, Base62.fromBase10(n)); | |
| } | |
| @Test | |
| public void testIntegerFromString() throws Exception { | |
| assertEquals(125, Base62.toBase10("cb")); | |
| } | |
| @Test | |
| public void testFromZero() { | |
| assertEquals("a", Base62.fromBase10(0)); | |
| assertEquals("b", Base62.fromBase10(1)); | |
| } | |
| } |
any string that starts with 'a' is not working
@guidomedina I would like to use your code in SchemaSpy, would it be ok? You'll retain copyright and it will be distributed under the terms of LGPL v3 or later.
nice practice I think that makes more sense start with 0, instead of 'a'
about @guidomedina example above. Be careful as his base62(int) method works with O(n^2) asymptotics, because sb.insert(0, ..) does system.arraycopy under the hood. It's better to do sb.append(...) and reverse the result at the end. We would have O(2n) which is O(n) asymptotically.
* assuming math operations are performed in constant time.
Edited my initial code sample to append and reverse ;-)
@npetzall I'm so sorry I missed your message, feel free, this is just a simple method, feel free to do with it whatever you want/need
guidomedina - nice solution!