如何压缩UUID长度?
java中UUID的toString方法,生成的uuid是36位了,在项目中,有时候会显的过长,占用空间比较多,如何能够压缩存储下,又能够保证uuid的唯一性呢?
一、 思路
看源码后,发现UUID的格式是这样的:
<time_low> "-" <time_mid> "-" <time_high_and_version> "-" <variant_and_sequence> "-" <node></>
它是一堆-分割的16进制的数字,如果只是为了保证唯一性,那这些-对我们来说是没有实际的用处的,可以直接去掉,这样我们就节省了4个字节,剩下32个字节。
接下来再想办法继续压缩这32个字节。
16进制的字符一共有16个,等于2的4次方。如果我们去自己对这16个字符进行编码,只需要4个bit就可以表示这16个字符,从0000 - 1111一共16个。
一个byte有8个bit,所以一个字节的高4位和低4位一共能放两个字符编码。
这样我们就能够再节省一半的空间。
最终我们就能够以16个字节存储36个字节的uuid了,空间节省了一半多。
二、 代码编写
private static String compressUUID(UUID uuid) { StringBuilder resultBuilder = new StringBuilder(); String uuidStr = uuid.toString(); boolean isFirst = false; int tmp = 0; for (int i = 0; i < 36; i++) { if (i == 8 || i == 13 || i == 18 || i == 23) { continue; } char c = uuidStr.charAt(i); short shortValue = Short.valueOf(String.valueOf(c), 16); if (!isFirst) { tmp += shortValue; isFirst = true; } else { tmp = tmp << 4; tmp += shortValue; resultBuilder.append((char) tmp); tmp = 0; isFirst = false; } } return resultBuilder.toString();}
代码相对比较简单。
for循环一遍,如果遇到-则跳过。
然后把char转换成short,把第一个字符放到short的高四位,把第二个字符放在short的低四位,然后把这个short转成char。
最后拼接成一个字符串。
三、 问题
这样压缩后,能够在代码中正常使用,但是对人来说可读性太差了,如果你打印的话,可能还显示不出来,这一点不是特别好。
大家看还有没有更好的解决方法,一起来讨论下。
如何压缩UUID长度?的更多相关文章
- Base64压缩UUID长度替换Hibernate原有UUID生成器
本文来自http://my.oschina.net/noahxiao/blog/132277,个人储藏使用 1.背景 在采用Hibernate做对象映射时,我一直都采用UUID来做主键.由于Hiber ...
- SAS学习笔记62 通过压缩变量长度来实现数据集压缩
有时候从其他数据库过来的字符型变量Length很长,导致数据集文件很大,可以通过压缩变量长度来实现数据集压缩 具体思路: LENGTH语句设置所有变量真实长度 SET数据集的时候对原有变量进行RENA ...
- 网站压缩数据 GZIP
//1.被压缩数据 String str="Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好H ...
- [转载]MySQL UUID() 函数
目录 目录 一 引子 二 MySQL UUID() 函数 三 复制中的 UUID()四 UUID_SHORT() 函数 3.1 实验环境介绍 3.2 搭建复制环境 3.3 基于 STATEMENT 模 ...
- zlib 压缩输出缓冲区 overflow 问题
[TOC] 问题 后台服务传包太大时,我们框架可以使用 zlib 库对响应进行压缩:在这次服务调试过程中,使用 zlib compress2 以 Z_BEST_COMPRESSION 模式进行压缩时, ...
- UUID那些事
UUID那些事 UUID 是一个全局唯一的通用识别码.它使用某种规则,而不是某种中心化的自增方式,来保证这个识别码的全局唯一性.UUID 有非常多的使用场景,比如在分布式系统中,需要生成全局唯一 ID ...
- luogu P2470 [SCOI2007]压缩
传送门 dalao们怎么状态都设的两维以上啊?qwq 完全可以一维状态的说 设\(f[i]\)为前缀i的答案,转移就枚举从前面哪里转移过来\(f[i]=min(f[j-1]+w(j,i))(j\in ...
- Nginx - 压缩模块
1. 前言 在 Nginx 中与网页压缩相关的模块有两个:一个是 HttpGzipModule,另一个是 HttpGzipStaticModule.前者用于启用在文件传输过程中使用 gzip 压缩,而 ...
- hihoCoder #1320 : 压缩字符串 区间dp
/** 题目:hihoCoder #1320 : 压缩字符串 链接:https://hihocoder.com/problemset/problem/1320 描述 小Hi希望压缩一个只包含大写字母' ...
随机推荐
- python学习第一天基础篇
学习背景:决定开始学习python之前,因为公司基本都是微软系统,所以很少碰到linux系统,机缘巧合接到了一个项目是使用shell对mysql进行backup,因为公司唯一的系统工程师是微软在行,对 ...
- 设计模式(8) - 迭代器模式(iterator)- 实现ArrayList和linkedList的迭代器
上周六就開始写这篇博客,之后一直耽误了.到前天才開始写.今天醒的早,就把这部分整理一下. 本文内容參考易学设计模式和马士兵的迭代器模式的视频. 了解迭代器模式一个作用就是让你在使用 迭代器遍历集合类的 ...
- 基于MATLAB边缘检测算子的实现
基于MATLAB边缘检测算子的实现 作者:lee神 1. 概述 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点.图像属性中的显著变化通常反映了属性的重要 ...
- mysql+mybatis递归调用
递归调用的应用场景常常出现在多级嵌套的情况,比如树形的菜单.下面通过一个简单的例子来实现mysql+mybatis的递归. 数据模型 private Integer categoryId; priva ...
- JavaScript 数组最大值
JavaScript 数组最大值 在js中可以使用Math.max()获取最大值. 如: console.log(Math.max("1","11"," ...
- 环境变量配置文件,本地登录前提示信息/etc/issue
让配置文件立即生效:source 配置文件 或 . 配置文件 /etc/profile 例:定义了HISTSIZE=1000 /etc/profile.d/*.sh /etc/bashrc ~/.ba ...
- CROSS JOIN,NATURAL JOIN
CROSS JOIN:笛卡尔积 NATURAL JOIN:
- Python3 学习Python流程--试水中
二.基础语法之后可以搭载服务器练习: 教程 一.1.Python 搭建环境. 初学基本语法 :Python基本语法 2.推荐 IDE : PyCharm CE 下载 菜鸟教程都是基础语法,可以对py ...
- lesson - 9 Linux系统软件包管理
1. rpm工具rpm Redhat Package Manager, 设计理念是开放的,不仅仅是在RedHat平台上,在SUSE上也是可以使用的. rpm包名字构成由-和.分成了若干部分,如abrt ...
- Jmeter3.2版本中Generating Report Dashboard功能浅析
自从投入到Jmeter怀抱,一直想找到一个比较不错的测试结果报告模板用于展示,类似于Loadrunner中导出html那种,但是苦苦的寻找始终没有一款让我看上眼的,包括Jmeter自带的xsl,虽然展 ...