日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

生成Base58格式的UUID(Hibernate Base64格式的UUID续)

發布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 生成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 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续)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产盗摄一区二区三区在线 | 中文在线a天堂 | 在线观看国产欧美 | 九九精品影院 | 亚洲国产精品毛片av不卡在线 | 五月天色婷婷丁香 | 欧美成人免费大片 | 一卡二卡三卡四卡在线 | 日韩精品视频在线播放 | 亚洲 美腿 欧美 偷拍 | 精品久久精品久久 | 一区二区三区四区五区在线视频 | 五月天色网站 | 美女大逼 | 富二代成人短视频 | 国产av无码专区亚洲av麻豆 | 久久精品国产亚洲AV成人婷婷 | 国产精品久久久久精 | a级一a一级在线观看 | 久久电影一区二区 | 91传媒在线播放 | 国产在线国偷精品免费看 | 国产精品三级在线 | 男人的天堂毛片 | 国产乱码一区二区三区播放 | 黄色1级大片 | 午夜性福利 | 在线免费观看中文字幕 | 91久久精品一区二区别 | 亚洲欧美日韩精品在线观看 | 亚洲午夜精品一区二区三区 | 国产高清一二三区 | 欧美大屁股熟妇bbbbbb | 天天夜夜操 | 午夜视频导航 | 日日操日日摸 | 天天操天天射天天爱 | 免费av看| 91视频99 | 91色伦 | 五月天丁香视频 | 国产一区在线播放 | 人人妻人人藻人人爽欧美一区 | 精品欧美一区二区在线观看 | 操欧美女 | 中文字幕无码毛片免费看 | 国产麻豆网 | 欧美黄色大片在线观看 | 极品另类| 茄子视频色 | 99精品免费观看 | 夜夜摸夜夜爽 | 视频一区二区在线观看 | 特级免费毛片 | 国产日本一区二区三区 | 熟妇毛片 | 91视频黄色 | 欧美日韩国产高清视频 | 久久精品在线观看 | 国产日韩欧美精品 | 国产露脸150部国语对白 | 木下凛凛子av一区二区三区 | 神马一区二区三区 | 夜夜躁狠狠躁日日躁 | 欧美日韩aa | 久久免费手机视频 | 欧美日韩一区二区三区视频 | 欧美一级成人 | 日本热久久| 黄色国产片 | 宅男噜噜噜666在线观看 | 欧美在线你懂的 | 欧美色一区二区三区在线观看 | 国产av一区二区三区传媒 | 国产黄色一区二区三区 | 国产精品变态另类虐交 | 亚洲成年人av | 天天人人综合 | 一区二区三区在线视频免费观看 | 午夜国产福利在线 | 亚洲激情自拍偷拍 | 三级三级久久三级久久 | 日本中文字幕免费 | 诱惑の诱惑筱田优在线播放 | 新超碰97| 天海翼中文字幕 | 激情视频在线免费观看 | 性感美女一级片 | 苍井空浴缸大战猛男120分钟 | 欧美极品一区二区 | 极品销魂美女少妇尤物 | 国产成人精品999在线观看 | 日本黄色三级 | 日韩av在线中文字幕 | 91黑丝视频| 国产做爰免费观看视频 | 成人二三区 | 成人国产欧美 | 干美女视频 |