为什么需要短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的更多相关文章

  1. Java 利用 UUID 生成唯一性 ID 示例代码

    用户ID首先生成,订单ID的生成可依赖用户ID. 下面代码前六位是日期,后八位是随机数,用于生成用户ID. public String getNewUserId() { String ipAddres ...

  2. 【Python】 uuid生成唯一ID

    uuid uuid是128位的全局唯一标识符(univeral unique identifier),通常用32位的一个字符串的形式来表现.有时也称guid(global unique identif ...

  3. python使用uuid生成唯一id或str

    介绍: UUID是128位的全局唯一标识符,通常由32字节的字符串表示. 使用: import uuid print uuid.uuid1() 14bfe806-f1c7-11e6-83b5-0680 ...

  4. js-shortid:优雅简洁地实现短ID

    短ID在实际运用中很广泛, 其中比较典型的运用就是短地址. 市面上肯定有不少开源的生成短ID库, 基于node.js的估计也不少. 鉴于本人已然是node.js的脑残粉(本职java开发), 很多业余 ...

  5. 一种基于Orleans的分布式Id生成方案

    基于Orleans的分布式Id生成方案,因Orleans的单实例.单线程模型,让这种实现变的简单,贴出一种实现,欢迎大家提出意见 public interface ISequenceNoGenerat ...

  6. 基于雪花算法生成分布式ID(Java版)

    SnowFlake算法原理介绍 在分布式系统中会将一个业务的系统部署到多台服务器上,用户随机访问其中一台,而之所以引入分布式系统就是为了让整个系统能够承载更大的访问量.诸如订单号这些我们需要它是全局唯 ...

  7. php 生成唯一id的几种解决方法

    php 生成唯一id的几种解决方法   网上查了下,有很多的方法 1.md5(time() . mt_rand(1,1000000)); 这种方法有一定的概率会出现重复 2.php内置函数uniqid ...

  8. php 生成唯一id的几种解决方法(实例)

    php 生成唯一id,网上查了下,有很多的方法 1.md5(time() . mt_rand(1,1000000)); 这种方法有一定的概率会出现重复 2.php内置函数uniqid() uniqid ...

  9. PHP生成唯一ID

    前言 PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳.在高并发或者间隔时长极短(如循环代码)的情况下,会出现大量重复数据.即使使用了第二个参数,也会重复,最好的方 ...

随机推荐

  1. QQ互联登陆出现(1054) Unknown column “conuintoken” in “field list”

    在dz论坛中打开了QQ互联登录功能之后提示(1054) Unknown column conuintoken in field list 错误 我们看到sql 错误就是说没有conuintoken字了 ...

  2. CF Preparing Olympiad (DFS)

    Preparing Olympiad time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. QTREE3 spoj 2798. Query on a tree again! 树链剖分+线段树

    Query on a tree again! 给出一棵树,树节点的颜色初始时为白色,有两种操作: 0.把节点x的颜色置反(黑变白,白变黑). 1.询问节点1到节点x的路径上第一个黑色节点的编号. 分析 ...

  4. MSP下载方式

    MSP430无论是仿真还是烧写程序,一般可以通过:JTAG.SBW.BSL接口进行. 1.JTAG是利用边界扫描技术,在430内部有逻辑接口给JTAG使用,内部有若干个寄存器连接到了430内部数据地址 ...

  5. js完美解决IE6不支持position:fixed的bug

    详细内容请点击 <!DOCTYPE html><html><head><meta http-equiv="Content-Type" co ...

  6. 使用T4为数据库自动生成实体类

    T4 (Text Template Transformation Toolkit) 是一个基于模板的代码生成器.使用T4你可以通过写一些ASP.NET-like模板,来生成C#, T-SQL, XML ...

  7. 如何把rtf、doc文件转换为HTML文件

    //retText是路径 1 public string ExtractHtml(string rtfText) { try { //Create word object Word.Applicati ...

  8. java模拟有验证码的Http登陆

    所需资源下载链接(资源免费,重在分享) Tesseract:http://download.csdn.net/detail/chenyangqi/9190667 jai_imageio-1.1-alp ...

  9. Oracle 联合主键

    alter table NCJSYD add constraints NCJSYD_pk primary key (YR,DQ);

  10. How Do I Declare A Block in Objective-C?

    As a local variable: returnType (^blockName)(parameterTypes) = ^returnType(parameters) {...}; As a p ...