看到这篇文章对UUID原理作了比较好的说明,很有帮助

https://blog.csdn.net/zzhongcy/article/details/114284696

里面的java实现,感觉还有优化的地方,这里用位移的方式来实现一次,耗时可以降低一个数量级,抛出来供大家讨论

package pri.go8;import lombok.extern.slf4j.Slf4j;import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.function.Function;@Slf4j
public class TestGo8 {// 注意,这里一共64个值,Z有3个private static final char[] source = new char[]{'a', 'b', 'c', 'd', 'e', 'f','g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's','t', 'u', 'v', 'w', 'x', 'y', 'z','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I','J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V','W', 'X', 'Y', 'Z', 'Z', 'Z'};private static final int MOD = source.length - 1;public static void main(String[] args) {// 大约800wfinal int size = 1 << 23;UUID[] uuids = new UUID[size];for (int i = 0; i < size; i++) {uuids[i] = UUID.randomUUID();}System.out.println("by string");exe(uuids, TestGo8::gen8ByStringBuild);System.out.println("by bit");exe(uuids, TestGo8::gen8ByBitMoving);System.out.println("test scale " + uuids.length);}public static void exe(UUID[] uuids, Function<UUID, String> function) {Set<String> b1 = new HashSet<>(uuids.length);final long currentTimeMillis = System.currentTimeMillis();for (int i = 0; i < uuids.length; i++) {if (!b1.add(function.apply(uuids[i]))) {log.warn("duplicated!!");}}System.out.println("cost " + (System.currentTimeMillis() - currentTimeMillis));}public static String gen8ByStringBuild(UUID uuid) {StringBuffer shortBuffer = new StringBuffer();String uuidString = uuid.toString().replace("-", "");for (int i = 0; i < 8; i++) {final String str = uuidString.substring(i * 4, i * 4 + 4);final int x = Integer.parseInt(str, 16);// 0x3E是62,source最后的Z重复了,不会影响这里的逻辑shortBuffer.append(source[x % 0x3E]);}return shortBuffer.toString();}public static String gen8ByBitMoving(UUID uuid) {// long类型占64位final long mostSignificantBits = uuid.getMostSignificantBits();final long leastSignificantBits = uuid.getLeastSignificantBits();char[] result = new char[8];result[0] = source[(int) (hash(mostSignificantBits >>> 48) & MOD)];result[1] = source[(int) (hash(mostSignificantBits << 16 >>> 16 >> 32) & MOD)];result[2] = source[(int) (hash(mostSignificantBits << 32 >>> 32 >> 16) & MOD)];result[3] = source[(int) (hash(mostSignificantBits << 48 >>> 48) & MOD)];result[4] = source[(int) (hash(leastSignificantBits >>> 48) & MOD)];result[5] = source[(int) (hash(leastSignificantBits << 16 >>> 16 >> 32) & MOD)];result[6] = source[(int) (hash(leastSignificantBits << 32 >>> 32 >> 16) & MOD)];result[7] = source[(int) (hash(leastSignificantBits << 48 >>> 48) & MOD)];return new String(result);}private static long hash(long input) {return input ^ (input >>> 32);}
}

执行结果,我的CPU是i5-8259U

by string
cost 21610
by bit
cost 3908
test scale 8388608

多执行几次的话,差距不大,也没有出现重复的结果

JAVA生成短8位UUID相关推荐

  1. UUID原理,以及JAVA生成短8位UUID

    最近需要生成短uuid,网上查了查资料,这里整理记录一下,供大家参考 1 前言 UUID,全名叫做 Universally Unique Identifier,也就是通用唯一标识符的意思.有时候,也叫 ...

  2. java uuid 第三方_JAVA生成短8位UUID

    java 原创,转载需注明. 短8位UUID思想其实借鉴微博短域名的生成方式,但是其重复概率过高,而且每次生成4个,需要随即选取一个. 本算法利用62个可打印字符,通过随机生成32位UUID,由于UU ...

  3. java 8位 uuid_JAVA生成短8位UUID详解

    短8位UUID思想其实借鉴微博短域名的生成方式,但是其重复概率过高,而且每次生成4个,需要随即选取一个. 本算法利用62个可打印字符,通过随机生成32位UUID,由于UUID都为十六进制,所以将UUI ...

  4. mysql 生成8位uuid_JAVA生成短8位UUID

    java 原创,转载需注明. 短8位UUID思想其实借鉴微博短域名的生成方式,但是其重复概率过高,而且每次生成4个,需要随即选取一个. 本算法利用62个可打印字符,通过随机生成32位UUID,由于UU ...

  5. java将uuid转换成大写,python生成大写32位uuid代码

    我就废话不多说了,还是直接看代码吧,希望对你有帮助! import uuid def getUUID(): return "".join(str(uuid.uuid4()).spl ...

  6. mybatisPlus 生成的19位uuid 在前端精度问题

    问题 生成的19 位uuid,如1405916999732707330.在前端存储时会变成1405916999732707300. 原因 JavaScript中所有的数字,无论是整数还是小数,其类型均 ...

  7. Python 基于Python生成短8位唯一id解决方案

    利用62个可打印字符,通过随机生成32位UUID,由于UUID都为十六进制,所以将UUID分成8组,每4个为一组,然后通过模62(字符0-9,a-z,A-Z总数量62个字符)操作,结果作为索引取出字符 ...

  8. java 生成短链接_java调用百度API生成短链接(一)

    短链接,顾名思义,用一个短的链接代替长而繁琐的真实链接 import net.sf.json.JSONObject; import org.apache.http.impl.client.Defaul ...

  9. java生成短信验证码_Java随机生成手机短信验证码的方法

    本文实例讲述了Java随机生成手机短信验证码的方法.分享给大家供大家参考,具体如下: /** * 创建指定数量的随机字符串 * @param numberFlag 是否是数字 * @param len ...

最新文章

  1. NavigationView的使用
  2. 国庆中秋活动——读完这两套书,宝宝就变小小物理学家了!
  3. 高仿人人Android梦想版终极源码发送(转)
  4. 技术分享连载(六十一)
  5. 不懂函数式?用mobx来写react应用吧
  6. excel根据条件列转行_Excel vba-根据不同筛选条件筛选后,拆分成新的excel工作簿...
  7. Numpy根据某一列进行排序
  8. 【翻译】What the f*ck JavaScript?(JavaScript你怎么这样啊???)
  9. php框架laravel构造者,Laravel框架的体系结构
  10. paraview的安装和使用
  11. AT&T拟利用电力线网络提供无线宽带服务
  12. c++小游戏大全(不定时更新)
  13. 通过 Land of Lisp 中的超简短字符游戏例程学习 loop 和 format
  14. oracle如果为0显示为1,解决Oracle的数值0.1只显示成.1问题
  15. 如何在线进行PDF文档压缩?
  16. C游戏编程入门第一讲心得
  17. win10系统Cortana搜索功能失效解决方法
  18. python如何计算环比增长率
  19. 内网沟通软件都有哪些?
  20. selenium自动化,更新到最新的chrome驱动

热门文章

  1. 5G+金融科技:万物互联下的智慧金融
  2. 美国大学排名之本科中最用功的学校top15
  3. python中一切内容都可以称为_Python中对象的概念很广泛,Python中的一切内容都可以称为 。...
  4. 双系统苹果Mac笔记本如何切换windows系统?
  5. 看完这篇关于电池的高票回答 可防储能大忽悠
  6. Huffman编码文件压缩
  7. 1对多 只取一条 mysql_MySQL 多表关联一对多查询实现取最新一条数据的方法示例...
  8. flink sql 执行源码走读全流程
  9. 全球变暖迫在眉睫碳中和势在必行 碳森羿建议提前布局
  10. 智慧校园-实验室预约介绍