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
GThFxPsdVUoZMfmKoEHwQX

Base58与Base64(URLSafe)一样也只需21或22个字符就可以标示128位的UUID数据。基本一样的长度,看上去更舒服,当然以后就采用Base58来生成UUID。配合Hibernate的UUID生成器

转载于:https://www.cnblogs.com/suncj/p/4230459.html

生成Base58格式的UUID(Hibernate Base64格式的UUID续)相关推荐

  1. 本地markdown文件自动生成|图片批量压缩并转base64格式|告别图床服务器|博文神器

    一.项目简介 问题来源 每次本地写好markdown格式的文档后,想要将它上传到博客网站上,但是本地的图片无法直接复制到网站的博客页面,每个图片需要重新点击上传,然后上传本地文件.其实也可以买一个图床 ...

  2. vue生成一个姓名的头像图片Base64格式

    关注微信公众号:每日玩机 获取ios.Android.tv.mac黑科技软件 本方法是写成了全局方法,用this.$userHead(name)调用,如需单独在一个页面中使用,也可以在页面中单独写成一 ...

  3. 将链接转成base64格式生成二维码和把页面生成图片

    将链接转成base64格式 function getUrlBase64 (url, etx, callback) {var canvas = document.createElement('canva ...

  4. 二维码生成 base64格式 Java

    第一步, 加入pom. <!-- 二维码 --><dependency><groupId>com.google.zxing</groupId><a ...

  5. iconfont 点击更新代码,默认不生成.eot、.svg、base64格式 请到编辑项目中配置

    最近发现iconfont有做一些调整: 下载包中的iconfont.css有做调整 更新前 更新后 那我们拿字体文件转成base64步骤如下 1.将ttf格式结尾的字体上传至https://trans ...

  6. php把网络图片转化为base64格式,解决html2canvas图片跨域问题

    一.前言 最近在用html2canvas做网页截图功能.这个开源库使用很简单,代码也很方便,但难点在于跨域问题.比如说,我的一个页面中有图片也有文字,图片是来自于图片服务器的网络图片.此时我们要生成截 ...

  7. 微信小程序中base64格式的小程序码通过canvas画出来无效

    使用场景 小程序中的文章详情页面有一个分享功能:用户点击分享按钮,生成一张分享图片(包括封面图,简介以及带有文章ID的小程序码),方便用户保存在本地. 问题说明 小程序码通过后台接口获取,格式如下:' ...

  8. ajax传递多个base64,H5移动开发Ajax上传多张Base64格式图片到服务器

    这篇文章主要为大家详细介绍了H5移动开发Ajax上传多张Base64格式图片到服务器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 废话不多说,直接看代码吧 1.上传组件 2.展示添加上的图片 v ...

  9. java读取pem格式私钥_openssl生成RSA格式及pkcs1与pkcs8格式互相转换

    openssl简介 OpenSSL 是一个开源项目,其组成主要包括以下三个组件: openssl:多用途的命令行工具 libcrypto:加密算法库 libssl:加密模块应用库,实现了ssl及tls ...

最新文章

  1. 思必驰携手博泰,共创智能汽车新声代
  2. 什么是Memcache
  3. ajax post forbidden,POST方法总是返回403 Forbidden
  4. 华为荣耀手机指令代码大全_双十二,华为/荣耀手机推荐选购指南,全系列横评推荐,那一款华为/荣耀手机最值得够买...
  5. Oracle 原理:游标,显示游标、隐式游标、参照游标
  6. 保利协鑫多晶硅产量再创历史记录
  7. tomcat如何查找请求资源的?
  8. 【VB.NET】VB.NET程序设计学习指南
  9. 2017.9.17 相关分析 思考记录
  10. Unix/Linux环境C编程入门教程(20) 搭建基于Mac的 Xcode 与 QT 开发环境
  11. 路由器——交换机——网络交换机:区别
  12. 【lphtw】第三弹笔记ex24-ex35
  13. 简单答题系统(判断题)
  14. 电机学习笔记 无刷电机控制6步换相
  15. 富芮坤FR801xH蓝牙协议栈启动流程和notify实现温度数据主动上传
  16. c++:一维黎曼问题多种格式求解
  17. 人工智能不止会批改作业,它还在改变“一刀切”的教学模式
  18. matlab电力系统潮流计算,基于MATLAB的电力系统潮流计算
  19. QUARTUS联合modelsim仿真(quartus13.0)
  20. 使用 Kube-capacity CLI 查看 Kubernetes 资源请求、限制和利用率

热门文章

  1. 拜托,面试别再问我表达式求值了!!!
  2. Spring Boot是如何实现自动配置的?
  3. 转向AIOps之前,你应该做好哪些准备?
  4. 从Thread.start()方法看Thread源码,多次start一个线程会怎么样
  5. REGULAR NOMINATION AGGRESSIVE NOMINATION
  6. mysql压力测试并优化_MySQL压力测试索引优化效果演示全过程
  7. zkcli远程连接_ZooKeeper 学习笔记(二)-API 操作和应用
  8. BODY background=自适应大小_自适应(电脑/平板/手机)网页,自适应网页设计练习总结...
  9. 布线干货 | 线缆截面积的测量标准
  10. 干货|用配电安全基础知识及隐患排查重点PPT