`
zhangyu84849467
  • 浏览: 15420 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 生成唯一的ID

 
阅读更多
/**
 * Generator for Globally unique Strings.
 */
public class IdGenerator {

    private static final Logger LOG = LoggerFactory.getLogger(IdGenerator.class);
    
    private static final String UNIQUE_STUB;
    
    private static int instanceCount;
    
    private static String hostName;
    
    private String seed;
    
    private final AtomicLong sequence = new AtomicLong(1);
    
    private int length;
    
   

    static {
    	
        String stub = "";
        
        boolean canAccessSystemProps = true;
        
        try {
        	
            SecurityManager sm = System.getSecurityManager();
            
            if (sm != null) {
            	
                sm.checkPropertiesAccess();
                
            }
            
        } catch (SecurityException se) {
        	
            canAccessSystemProps = false;
            
        }

        if (canAccessSystemProps) {
        	
            int idGeneratorPort = 0;
            
            ServerSocket ss = null;
            
            try {

                
                
                LOG.trace("Using port {}", idGeneratorPort);

                hostName = InetAddressUtil.getLocalHostName();
                
                ss = new ServerSocket(idGeneratorPort);
                // -54842-1451457944520-
                stub = "-" + ss.getLocalPort() + "-" + System.currentTimeMillis() + "-";
                
                Thread.sleep(100);
                
            } catch (Exception e) {
            	
                if (LOG.isTraceEnabled()) {
                    LOG.trace("could not generate unique stub by using DNS and binding to local port", e);
                } else {
                    LOG.warn("could not generate unique stub by using DNS and binding to local port: {} {}", e.getClass().getCanonicalName(), e.getMessage());
                }

                // Restore interrupted state so higher level code can deal with it.
                if (e instanceof InterruptedException) {
                    Thread.currentThread().interrupt();
                }
            } finally {
                if (ss != null) {
                    try {
                        // TODO: replace the following line with IOHelper.close(ss) when Java 6 support is dropped
                        ss.close();
                    } catch (IOException ioe) {
                        if (LOG.isTraceEnabled()) {
                            LOG.trace("Closing the server socket failed", ioe);
                        } else {
                            LOG.warn("Closing the server socket failed" + " due " + ioe.getMessage());
                        }
                    }
                }
            }
        }
        // fallback
        if (hostName == null) {
            hostName = "localhost";
        }
        hostName = sanitizeHostName(hostName);

        if (stub.length() == 0) {
            stub = "-1-" + System.currentTimeMillis() + "-";
        }
        UNIQUE_STUB = stub;
    }

    /**
     * Construct an IdGenerator
     */
    public IdGenerator(String prefix) {
        synchronized (UNIQUE_STUB) {
            this.seed = prefix + UNIQUE_STUB + (instanceCount++) + ":";
            this.length = this.seed.length() + ("" + Long.MAX_VALUE).length();
        }
    }

    public IdGenerator() {
        this("ID:" + hostName);
    }

    /**
     * As we have to find the hostname as a side-affect of generating a unique
     * stub, we allow it's easy retrieval here
     *
     * @return the local host name
     */
    public static String getHostName() {
        return hostName;
    }

    /**
     * Generate a unique id
     *
     * @return a unique id
     */
    public synchronized String generateId() {
        StringBuilder sb = new StringBuilder(length);
        sb.append(seed);
        sb.append(sequence.getAndIncrement());
        return sb.toString();
    }

    public static String sanitizeHostName(String hostName) {
        boolean changed = false;

        StringBuilder sb = new StringBuilder();
        for (char ch : hostName.toCharArray()) {
            // only include ASCII chars
            if (ch < 127) {
                sb.append(ch);
            } else {
                changed = true;
            }
        }

        if (changed) {
            String newHost = sb.toString();
            LOG.info("Sanitized hostname from: {} to: {}", hostName, newHost);
            return newHost;
        } else {
            return hostName;
        }
    }

   

   

   

    
//    public static void main(String[] args) {
//    	IdGenerator generator = new IdGenerator();
//    	System.out.println(generator.generateId());
//	}
}

 

分享到:
评论

相关推荐

    java生成唯一id(uuid)(不依赖jdk5,自己实现的)

    在Java编程中,生成唯一的ID(Universal Unique Identifier,UUID)是一项常见的需求,特别是在数据库记录、分布式系统中的对象标识等方面。UUID是一种128位的数字,通常以32个字符的16进制形式表示,确保在全球范围...

    java语言生成唯一ID的方法

    ### Java语言生成唯一ID的方法 在Java开发过程中,经常需要为数据对象生成唯一的标识符(ID),以便于数据管理、追踪等操作。本文将详细解析一个具体的Java类——`UniqId`,它用于生成唯一ID。该类通过结合当前...

    java根据时间生成唯一ID

    java根据时间生成唯一ID,普通的根据时间生成的ID放在循环内很容易重复。

    20位不重复id生成器

    生成20位不重复id,生成6位验证码,生成uuid等等帮助方法

    java 获取分布式唯一ID.雪花ID

    在描述中提到的`IdUtils`可能是一个自定义的工具类,提供了两种生成唯一ID的方法: 1. `IdUtils.simpleUUID()`:这通常会返回一个基于`java.util.UUID`生成的16进制字符串形式的UUID,长度为32个字符,用于生成字符...

    JAVA自带的方法生成唯一ID

    java中有自带的方法可以自动帮助我们实现id的获取,可以作为稳定的工具类。可自定义。

    官方Java端口的Sqids生成短唯一的id从数字.zip

    总结来说,官方Java端口的Sqids是一个强大的工具,它为Java开发者提供了一种生成短而唯一ID的解决方案。通过对时间戳、序列号和工作节点ID的巧妙组合, Sqids能够在分布式环境中有效地保证ID的唯一性,同时保持较高...

    java自动生成id策略

    "java自动生成id策略"指的是设计并实现一种机制,确保在多线程环境下能够高效、唯一地生成ID。这里我们将详细探讨这个主题,以及如何根据描述实现这样的策略。 首先,ID的生成通常要求满足以下条件: 1. 唯一性:...

    生成唯一ID工具类12到25位都有

    本人用的生成数据库id唯一的工具类,上传来分享给大家。

    Springboot唯一编号整合,vesta全局唯一id生成器

    - 在需要生成唯一ID的方法中调用这个Service。 4. **高并发处理**: - Vesta ID Generator通过优化的算法和线程安全的设计,能够有效地处理高并发场景,避免了竞争条件和ID重复的问题。 - 在分布式环境中,每个...

    java生成16位long类型id

    1.获取系统时间 + 随机数,但是由于系统时间前几位是相同的,所以截取几位数字; 2.获取随机数,math的方法,截取几位数字; 3.判重校验

    Java中生成唯一ID的方法示例

    "Java中生成唯一ID的方法示例" Java中生成唯一ID的方法示例是指在Java编程语言中生成唯一标识符的多种方法。这些方法可以应用于各种场景,如生成订单号、用户ID、交易ID等。在本篇文章中,我们将介绍两种常见的生成...

    java数据库唯一id生成工具类

    Java数据库唯一ID生成工具类可以应用于各种需要生成唯一ID号码的场景,例如: *生成订单号码。 *生成用户ID。 *生成数据记录的唯一标识。 6. 工具类的优点 Java数据库唯一ID生成工具类具有以下几个优点: *生成...

    java生成UUID通用唯一识别码.docx

    Java中的UUID(Universally Unique Identifier)是一种用于生成全局唯一标识符的标准,由开源软件基金会(OSF)在分布式计算环境中提出。UUID的主要目的是确保在分布式系统中的任何元素都有其独特的识别信息,无需...

    java基于雪花算法的唯一ID生成器

    java基于雪花算法的唯一ID生成器

    java 分布式 代码生成器 唯一ID

    1. **雪花算法(Snowflake)**:这是Twitter开源的一种生成唯一ID的方法。雪花算法将ID分为三部分:时间戳(41位)、工作机器ID(10位)和序列号(12位)。时间戳确保了ID的时间有序性,工作机器ID则区分不同的节点,...

    全局唯一ID生成

    在单体应用时代,我们可以通过数据库自增ID或时间戳+序列号等方式生成唯一ID。但在分布式环境下,这些方法往往无法满足需求,因为它们可能会导致ID冲突或性能瓶颈。 一种常见的分布式ID生成方案是雪花算法...

    java生成8位UUID

    java 生成8位UUID,解决UUID2太长的问题,欢迎下载。后续代码,陆续放出

    java快速ID自增器

    在Java开发中,高效地生成唯一且自增的ID是许多系统设计的关键部分。"Java快速ID自增器"就是为了解决这个问题而设计的一种工具或解决方案。它旨在提供一个高性能、线程安全的方式来生成自增ID,尤其适用于那些需要...

    javaID生成器javaID生成器

    ### Java ID生成器详解 #### 一、引言 在软件开发过程中,特别是在数据库操作时,经常需要为每个新创建的记录分配一个唯一的标识符(ID)。为了满足这一需求,Java 开发者们通常会设计一种高效且可靠的 ID 生成...

Global site tag (gtag.js) - Google Analytics