生成Base58格式的UUID(Hibernate Base64格式的UUID续)
Base58簡介
Base58采用的字符集合為“123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ”,從這不難看出,Base58是純數字與字母組成而且去掉了容易引起視覺混淆的字符(0:數字零,O:大寫O,I:大寫i,l:小寫L)。9個數字+49個字母=58個。由于沒有特殊字符所以在采用鼠標雙擊或移動設備選擇時可以自動識別全選。
Base58本身就是URLSafe。Base64的URFSafe模式雖然已經對URL支持的比較好,但UUID中還是包含“-或_”。
目前流行的比特幣,采用的就是Base58Check編碼,是在Base58基礎上又增加了安全效驗機制。
三、Base58編碼器程序
由于Base58最近才興起,Java與Apache Commons中并不包含編碼器。
package org.noahx.uuid.utils;import java.io.UnsupportedEncodingException; import java.math.BigInteger;/*** Created with IntelliJ IDEA.* User: noah* Date: 8/2/13* Time: 10:36 AM* To change this template use File | Settings | File Templates.*/ public class Base58 {public static final char[] ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz".toCharArray();private static final int[] INDEXES = new int[128];static {for (int i = 0; i < INDEXES.length; i++) {INDEXES[i] = -1;}for (int i = 0; i < ALPHABET.length; i++) {INDEXES[ALPHABET[i]] = i;}}/*** Encodes the given bytes in base58. No checksum is appended.*/public static String encode(byte[] input) {if (input.length == 0) {return "";}input = copyOfRange(input, 0, input.length);// Count leading zeroes.int zeroCount = 0;while (zeroCount < input.length && input[zeroCount] == 0) {++zeroCount;}// The actual encoding.byte[] temp = new byte[input.length * 2];int j = temp.length;int startAt = zeroCount;while (startAt < input.length) {byte mod = divmod58(input, startAt);if (input[startAt] == 0) {++startAt;}temp[--j] = (byte) ALPHABET[mod];}// Strip extra '1' if there are some after decoding.while (j < temp.length && temp[j] == ALPHABET[0]) {++j;}// Add as many leading '1' as there were leading zeros.while (--zeroCount >= 0) {temp[--j] = (byte) ALPHABET[0];}byte[] output = copyOfRange(temp, j, temp.length);try {return new String(output, "US-ASCII");} catch (UnsupportedEncodingException e) {throw new RuntimeException(e); // Cannot happen. }}public static byte[] decode(String input) throws IllegalArgumentException {if (input.length() == 0) {return new byte[0];}byte[] input58 = new byte[input.length()];// Transform the String to a base58 byte sequencefor (int i = 0; i < input.length(); ++i) {char c = input.charAt(i);int digit58 = -1;if (c >= 0 && c < 128) {digit58 = INDEXES[c];}if (digit58 < 0) {throw new IllegalArgumentException("Illegal character " + c + " at " + i);}input58[i] = (byte) digit58;}// Count leading zeroesint zeroCount = 0;while (zeroCount < input58.length && input58[zeroCount] == 0) {++zeroCount;}// The encodingbyte[] temp = new byte[input.length()];int j = temp.length;int startAt = zeroCount;while (startAt < input58.length) {byte mod = divmod256(input58, startAt);if (input58[startAt] == 0) {++startAt;}temp[--j] = mod;}// Do no add extra leading zeroes, move j to first non null byte.while (j < temp.length && temp[j] == 0) {++j;}return copyOfRange(temp, j - zeroCount, temp.length);}public static BigInteger decodeToBigInteger(String input) throws IllegalArgumentException {return new BigInteger(1, decode(input));}//// number -> number / 58, returns number % 58// private static byte divmod58(byte[] number, int startAt) {int remainder = 0;for (int i = startAt; i < number.length; i++) {int digit256 = (int) number[i] & 0xFF;int temp = remainder * 256 + digit256;number[i] = (byte) (temp / 58);remainder = temp % 58;}return (byte) remainder;}//// number -> number / 256, returns number % 256// private static byte divmod256(byte[] number58, int startAt) {int remainder = 0;for (int i = startAt; i < number58.length; i++) {int digit58 = (int) number58[i] & 0xFF;int temp = remainder * 58 + digit58;number58[i] = (byte) (temp / 256);remainder = temp % 256;}return (byte) remainder;}private static byte[] copyOfRange(byte[] source, int from, int to) {byte[] range = new byte[to - from];System.arraycopy(source, from, range, 0, range.length);return range;}}UUID生成程序
這個生成UUID程序包含了Base64(URLSafe)與Base58兩種編碼。
package org.noahx.uuid.util;import org.apache.commons.codec.binary.Base64;import java.nio.ByteBuffer; import java.util.UUID;public abstract class UuidUtils {public static String uuid() {UUID uuid = UUID.randomUUID();return uuid.toString();}public static String base64Uuid() {UUID uuid = UUID.randomUUID();return base64Uuid(uuid);}protected static String base64Uuid(UUID uuid) {ByteBuffer bb = ByteBuffer.wrap(new byte[16]);bb.putLong(uuid.getMostSignificantBits());bb.putLong(uuid.getLeastSignificantBits());return Base64.encodeBase64URLSafeString(bb.array());}public static String encodeBase64Uuid(String uuidString) {UUID uuid = UUID.fromString(uuidString);return base64Uuid(uuid);}public static String decodeBase64Uuid(String compressedUuid) {byte[] byUuid = Base64.decodeBase64(compressedUuid);ByteBuffer bb = ByteBuffer.wrap(byUuid);UUID uuid = new UUID(bb.getLong(), bb.getLong());return uuid.toString();}public static String base58Uuid() {UUID uuid = UUID.randomUUID();return base58Uuid(uuid);}protected static String base58Uuid(UUID uuid) {ByteBuffer bb = ByteBuffer.wrap(new byte[16]);bb.putLong(uuid.getMostSignificantBits());bb.putLong(uuid.getLeastSignificantBits());return Base58.encode(bb.array());}public static String encodeBase58Uuid(String uuidString) {UUID uuid = UUID.fromString(uuidString);return base58Uuid(uuid);}public static String decodeBase58Uuid(String base58uuid) {byte[] byUuid = Base58.decode(base58uuid);ByteBuffer bb = ByteBuffer.wrap(byUuid);UUID uuid = new UUID(bb.getLong(), bb.getLong());return uuid.toString();} }生成UUID的效果
1、Base64的效果
M0ISICCxQi6sP-KIq3kFOw 11YozyYYTvKmuUXpRDvoJA KlZnS-MuT2m3d-the2chxg 8J3SC10AQzqZr6Im8V2xYA ES1UiFTGTHqn6ADU5YW0aw 1usa208oT1q7FitKbQHH5Q 53aDQZxKTGyqmKCzDnBwYQ SVVjViEoQXayWB9_JknKqQ fP6znJIAT1uGMN9HW5o8cw YR-2-kKmSOubhGr2LpFCgQ可以看到有-與_字符。大家可以雙擊上面包含-的UUID,得到只選中部分的效果。
2、Base58的效果
MqJqC2rtZLkuHys6ed2Eai QrS5w2t5etpRY3zTR1BAEJ Qd6wcFFVz2ZSQb3voGGj8P 75bJdWMcEh6NhT51D5Uyju 2L7kTgsktxMBKLkfAo2iWC UX2Twhbt1kstRziqc7iwCR 9tZNKCeR93taLHU6PVy8hN HSn6JMibca4nG9URWokpwg 8eL4SNz2a4puEW8fD4njsG GThFxPsdVUoZMfmKoEHwQXBase58與Base64(URLSafe)一樣也只需21或22個字符就可以標示128位的UUID數據?;疽粯拥拈L度,看上去更舒服,當然以后就采用Base58來生成UUID。配合Hibernate的UUID生成器
轉載于:https://www.cnblogs.com/suncj/p/4230459.html
總結
以上是生活随笔為你收集整理的生成Base58格式的UUID(Hibernate Base64格式的UUID续)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Servlet3.0学习总结(三)——基
- 下一篇: GPL/dnsmasq源代码分析, DN