基于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()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳.在高并发或者间隔时长极短(如循环代码)的情况下,会出现大量重复数据.即使使用了第二个参数,也会重复,最好的方 ...
随机推荐
- JS中String类型转换Date类型 并 计算时间差
JS中String类型转换Date类型 1.比较常用的方法,但繁琐,参考如下:主要使用Date的构造方法:Date(int year , int month , int day)<script& ...
- cxGrid使用汇总1
这些都不是原创,只是平时收集到资料然后整理的,有些可能百度一下到处都是而且还大同小异也有些不是很好找,现在贴出来希望给那些用到cxGrid的人会有所帮助 1. 去掉cxGrid中台头的Box 解决:在 ...
- hdu 3663 DLX
思路:把每个点拆成(d+1)*n列,行数为可拆分区间数.对所有的有i号点拆分出来的行都要建一条该行到i列的边,那么就能确保有i号点拆出来的行只能选择一行. #include<set> #i ...
- Dijkstra最短路径算法
#include <iostream> #include <vector> #include <cstring> #include <cstdio> # ...
- IntelliJ IDEA 集成Tomcat后找不到HttpServlet问题(2015年06月13日)
今天第一次用IntelliJ IDEA集成Tomcat做东西玩,在IntelliJ IDEA中配置好Tomcat之后,开始写Servlet,结果却找不到HttpServlet类,原因就是Intelli ...
- asp.net的简单分页程序
*.apsx页面 1: <%@ Page Language="C#" Debug ="true" AutoEventWireup="true&q ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(一)(转)
由于上面一个项目使用的是ASP.NET4.0 MVC3.0,在招人的时候发现很多人有听说过MVC,但是却是没用过,对MVC也只是一知半解,最近想给团队成员做一个系统的解说,让大家都可以学习一下ASP. ...
- MySQL之控制台修改密码
进入控制台:use mysql Database changed update user set password=PASSWORD('设置的密码') where user='root'; flush ...
- C#中 StringBuilder类 与 String类的区别---(转)
在找工作的时候,去了些公司,避免不了要面试和笔试.不过一般最起初的是笔试.我印象中有这样有一道题目:StringBuilder类与 String类的区别?那时候我不太清楚这两个类的区别,今天在看代 ...
- OC11_真正的代理
// // ReceiveReportDelegate.h // OC11_真正的代理 // // Created by zhangxueming on 15/6/24. // Copyright ( ...