基于UUID生成短ID
为什么需要短ID
数据库操作过程最常用到:
- 自增ID
- UUID
前者多数依赖Mysql的auto_increment,但数据移植麻烦. 如果是主从或主主,不同库里自增ID还可能不一致.
后者长度是个问题.
怎样生成短ID
- 生成UUID
- 哈希murmur为64bit
- 使用64进制显示
public class ClientShardInfo {
public static void main(String[] args) {
Map<Long, Integer> result = new HashMap<>();
long start = System.currentTimeMillis();
for (int i = 0; i < 10000 * 100; i++) {
long hash = nextShortId();
System.out.println(Long.toUnsignedString(hash, 32));
Integer val = result.get(hash);
if (val == null) {
val = 1;
} else {
val++;
}
result.put(hash, val);
}
long end = System.currentTimeMillis();
System.out.println("used time:" + (end - start));
System.out.println(result);
}
public static long nextShortId() {
UUID uuid = UUID.randomUUID();
long h = uuid.getMostSignificantBits();
long l = uuid.getLeastSignificantBits();
byte[] bytes = new byte[16];
bytes[0] = (byte) ((h >>> 56) & 0xFF);
bytes[1] = (byte) ((h >>> 48) & 0xFF);
bytes[2] = (byte) ((h >>> 40) & 0xFF);
bytes[3] = (byte) ((h >>> 32) & 0xFF);
bytes[4] = (byte) ((h >>> 24) & 0xFF);
bytes[5] = (byte) ((h >>> 16) & 0xFF);
bytes[6] = (byte) ((h >>> 8) & 0xFF);
bytes[7] = (byte) (h & 0xFF);
bytes[8] = (byte) ((l >>> 56) & 0xFF);
bytes[9] = (byte) ((l >>> 48) & 0xFF);
bytes[10] = (byte) ((l >>> 40) & 0xFF);
bytes[11] = (byte) ((l >>> 32) & 0xFF);
bytes[12] = (byte) ((l >>> 24) & 0xFF);
bytes[13] = (byte) ((l >>> 16) & 0xFF);
bytes[14] = (byte) ((l >>> 8) & 0xFF);
bytes[15] = (byte) (l & 0xFF);
return Hashing.MURMUR_HASH.hash(bytes);
}
}
生成结果:
- 32进制,5bit一个字符, 64bit大约12~13个字符.
- 用64进制, 6bit一个字符, 64bit大约11~12个字符
循环1000W,碰撞率为0.
基于UUID生成短ID的更多相关文章
- Java 利用 UUID 生成唯一性 ID 示例代码
用户ID首先生成,订单ID的生成可依赖用户ID. 下面代码前六位是日期,后八位是随机数,用于生成用户ID. public String getNewUserId() { String ipAddres ...
- 【Python】 uuid生成唯一ID
uuid uuid是128位的全局唯一标识符(univeral unique identifier),通常用32位的一个字符串的形式来表现.有时也称guid(global unique identif ...
- python使用uuid生成唯一id或str
介绍: UUID是128位的全局唯一标识符,通常由32字节的字符串表示. 使用: import uuid print uuid.uuid1() 14bfe806-f1c7-11e6-83b5-0680 ...
- js-shortid:优雅简洁地实现短ID
短ID在实际运用中很广泛, 其中比较典型的运用就是短地址. 市面上肯定有不少开源的生成短ID库, 基于node.js的估计也不少. 鉴于本人已然是node.js的脑残粉(本职java开发), 很多业余 ...
- 一种基于Orleans的分布式Id生成方案
基于Orleans的分布式Id生成方案,因Orleans的单实例.单线程模型,让这种实现变的简单,贴出一种实现,欢迎大家提出意见 public interface ISequenceNoGenerat ...
- 基于雪花算法生成分布式ID(Java版)
SnowFlake算法原理介绍 在分布式系统中会将一个业务的系统部署到多台服务器上,用户随机访问其中一台,而之所以引入分布式系统就是为了让整个系统能够承载更大的访问量.诸如订单号这些我们需要它是全局唯 ...
- php 生成唯一id的几种解决方法
php 生成唯一id的几种解决方法 网上查了下,有很多的方法 1.md5(time() . mt_rand(1,1000000)); 这种方法有一定的概率会出现重复 2.php内置函数uniqid ...
- php 生成唯一id的几种解决方法(实例)
php 生成唯一id,网上查了下,有很多的方法 1.md5(time() . mt_rand(1,1000000)); 这种方法有一定的概率会出现重复 2.php内置函数uniqid() uniqid ...
- PHP生成唯一ID
前言 PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳.在高并发或者间隔时长极短(如循环代码)的情况下,会出现大量重复数据.即使使用了第二个参数,也会重复,最好的方 ...
随机推荐
- HDU 2571 命运 (DP)
命运 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Pr ...
- Storm累计求和中使用各种分组Grouping
Shuffle Grouping: 随机分组, 随机派发stream里面的tuple, 保证bolt中的每个任务接收到的tuple数目相同.(它能实现较好的负载均衡) Fields Grouping: ...
- 服务器调用JS
服务器控件调用JS一.两类JS的触发设计1.提交之前的JS -- 加js的事件例:<script language="javascript"> // 构造函数 func ...
- DNA电荷转移:电阻的计算公式 & Marcus电子转移理论
更新:26 APR 2016 参考文献: [1] Mechanisms for DNA Charge Transport. Chem. Rev. 2010, 110, 3, 1642-1662 [电子 ...
- Warning: Permanently added '...' (RSA) to the list of known hosts --Windows下git bash 警告处理
原链接地址 StackOverflow 处理方法: 创建文件~/.ssh/config, 此处对应windows当前用户目录下的.ssh文件夹 增加如下语句 UserKnownHostsFile ~/ ...
- subilme增加对markdown的高亮支持
sublime2对markdown原生主题支持都没有, 需要通过插件补充 1.插件安装 通过Package Control安装下列插件: Markdown Extended Monokai Exten ...
- Mysql按时间段分组查询来统计会员的个数
1.使用case when方法(不建议使用)- 代码如下 复制代码 SELECT COUNT(DISTINCT user_id) user_count, CASE WHEN cre ...
- ASP.NET缓存 Cache之数据缓存
添加 Cache[Key]=object or Cache.Insert 移除 Cache.Remove(key) 1.将值直接写入Cache 代码如下 复制代码 HttpContext.Curre ...
- 【学习笔记】【C语言】scanf函数
1. 简介 这也是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>.调用scanf函数时,需要传入变量的地址作为参数,scanf函数会等待标准输入设 ...
- OC4_遵守多个协议
// // Calulator.h // OC4_遵守多个协议 // // Created by zhangxueming on 15/6/24. // Copyright (c) 2015年 zha ...