package test;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID; public class IdUtil {
private final static int HASH_LENGTH = 7;
private static String[] chars = new String[] {
"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" }; /**
* 得到一个8位的随机串
* @return
*/
private static String getShortUuid() {
StringBuffer buffer = new StringBuffer();
String uuid = UUID.randomUUID().toString().replace("-", "");
for (int i = 0; i < 8; i++) {
String str = uuid.substring(i * 4, i * 4 + 4);
int x = Integer.parseInt(str, 16);
buffer.append(chars[x % 0x3E]);
}
return buffer.toString();
} /**
* 得到一个7位的threadhash
* @return
*/
private static String getThreadHash(){
String hash = String.valueOf(Thread.currentThread().hashCode());
if(hash.length() != HASH_LENGTH){
hash = dealHash(hash);
}
return hash;
} /**
* 处理hash长度
* @param hash
* @return
*/
private static String dealHash(String hash){
//如果长度大于HASH_LENGTH,取HASH_LENGTH位长度
if(hash.length() > HASH_LENGTH){
hash = hash.substring(hash.length() - HASH_LENGTH, hash.length());
}else{
//如果长度小于HASH_LENGTH,前边补0
int diff = HASH_LENGTH - hash.length();
StringBuffer buffer = new StringBuffer();
for(int i=0;i<diff;i++){
buffer.append(0);
}
buffer.append(hash);
hash = buffer.toString();
}
return hash;
} /**
* 得到一个32位的id[jdk1.8的时间类型,如果低版本jdk,需要重写时间相关]
* 时间+线程hash+随机串
* @return
*/
public static String getId(){
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter formartter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
String current = formartter.format(localDateTime); StringBuffer buffer = new StringBuffer(32);
buffer.append(current);
buffer.append(getThreadHash());
buffer.append(getShortUuid()); System.out.println("ID:" + buffer.toString()); return buffer.toString();
} public static void main(String[] args) {
getId();
}
}

生成id的更多相关文章

  1. Solr4.0 如何配置使用UUID自动生成id值

    原文链接http://blog.csdn.net/keepthinking_/article/details/8501058#comments 最近学习了Lucene,随便也学习了Solr,Solr规 ...

  2. c#实现分组服务器,单一无重复生成ID

    class Program { static void Main(string[] args) { List<Thread> threads = new List<Thread> ...

  3. Solr自动生成ID

    在Solr中,每一个索引,都要有一个唯一的ID,类似于关系型数据库表中的主键.为了方便创建索引,需要配置自动生成的ID,即UUID. 一.配置schema.xml文件 添加uuid字段类型,修改字段i ...

  4. knockout为绑定元素生成id

    knockout 提供生成了uniqueName的方法,但没有提供生成Id的方法. 感谢stackoverflow提供的思路与方法. 下面是uniqueName的实现方法. ko.bindingHan ...

  5. mybatis多表查询,自动生成id

    主要是在配置文件中,配置好所要包含的字段. 类关系:account----role,1对1 account包含role类 java类: public class Account{ private In ...

  6. ASP.NET 4.0 ListView等容器控件中获取ClientID值与HTML中自动生成ID字符串不一样问题。

    ASP.NET 4.0 中 ClientIDMode的属性 可以设置获取不同ID格式的值. 项目中遇到的问题: 1.ListView1 ItemDataBound事件中,获取ClientID结果与自动 ...

  7. Elasticsearch 索引文档如何使用自动生成 Id?

    一个文档的 _index . _type 和 _id 唯一标识一个文档. 我们可以提供自定义的 _id 值,或者让 index API 自动生成. 如果你的数据没有自然的 ID, Elasticsea ...

  8. 生成ID之雪花算法

    package com.shopping.test; /** * SnowFlake的结构如下(每部分用-分开):<br> * 0 - 0000000000 0000000000 0000 ...

  9. 雪花算法生成ID

    前言我们的数据库在设计时一般有两个ID,自增的id为主键,还有一个业务ID使用UUID生成.自增id在需要分表的情况下做为业务主键不太理想,所以我们增加了uuid作为业务ID,有了业务id仍然还存在自 ...

  10. 关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题

    因为和同学分开做的android软件,现在想整合他做的界面部分,于是拷贝了res和src文件夹的文件,其中包括一个res.menu文件夹中的XML.但是每次将该文件导入到工程总无法自动在R.java中 ...

随机推荐

  1. Internet Explorer 已限制此网页运行脚本或ActiveX控件。 允许阻止的内容(A)

    打开“Internet选项”->"高级",勾选"允许活动内容在“我的电脑”的文件中运行".重启IE

  2. osggeometry修改更新顶点

    osg::Geometry *geometry = geode->getDrawable()->asGeometry();geometry->setDataVariance(osg: ...

  3. classmethod作用

    >>> class A(object): bar = 1 def func1(self): print 'foo' >>> class A(object): bar ...

  4. android控件RecyclerView中,如何显示自定义分割线以及最后一项去除分割线

    在控件RecyclerView中,分割线DividerItemDecoration类的使用经常见,如果是使用自带的分割线,只需要这样写即可 RecyclerView mRecyclerView; mR ...

  5. Android查看文件大小

    查看当前路径下的各个挂载模块的大小及剩余量(例如在根目录执行) df #输出 Filesystem Size Used Free Blksize /sys/fs/cgroup .0K /mnt/ase ...

  6. spark连数据库

    DataFrame提供了一条联结所有主流数据源并自动转化为可并行处理格式的渠道,通过它Spark能取悦大数据生态链上的所有玩家,无论是善用R的数据科学家,惯用SQL的商业分析师,还是在意效率和实时性的 ...

  7. Python读取一个目录下的所有文件

    #!/usr/bin/python # -*- coding:utf8 -*- import os allFileNum = 0 def printPath(level, path): global ...

  8. poj3278_kuagnbin带你飞专题一

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 88247   Accepted: 27640 ...

  9. Lucene入门学习

    技术原理: 开发环境: lucene包:分词包,核心包,高亮显示(highlight和memory),查询包.(下载请到官网去查看,如若下载其他版本,请看我的上篇文档,在luke里面) 原文文档: 入 ...

  10. mac shell 获取ip,自动启动文件http服务

    因为工作原因,时常有文件传输需求. rz.nc.rsync都用过,各有各的好处. 但相对的,向别处推文件时总有各种麻烦,尤其是在给同事发送文件时. 然后就想到了提供http服务. 在环境变量中定义别名 ...