美文网首页
生成30的全局ID

生成30的全局ID

作者: 小诸葛686 | 来源:发表于2019-10-15 10:55 被阅读0次

public class TraceIdGenerator {

private static String        IP_16 = "ffffffff";
private static AtomicInteger count = new AtomicInteger(1000);

static {
    try {
        String ipAddress = getInetAddress();
        if (ipAddress != null) {
            IP_16 = getIP_16(ipAddress);
        }
    } catch (Throwable e) {
        /*
         * empty catch block
         */
    }
}

private static String getTraceId(String ip, long timestamp, int nextId) {
    StringBuilder appender = new StringBuilder(30);
    appender.append(ip).append(timestamp).append(nextId).append(TracerUtils.getPID());
    return appender.toString();
}

public static String generate() {
    return getTraceId(IP_16, System.currentTimeMillis(), getNextId());
}

private static String getIP_16(String ip) {
    String[] ips = ip.split("\\.");
    StringBuilder sb = new StringBuilder();
    for (String column : ips) {
        String hex = Integer.toHexString(Integer.parseInt(column));
        if (hex.length() == 1) {
            sb.append('0').append(hex);
        } else {
            sb.append(hex);
        }

    }
    return sb.toString();
}

private static int getNextId() {
    for (;;) {
        int current = count.get();
        int next = (current > 9000) ? 1000 : current + 1;
        if (count.compareAndSet(current, next)) {
            return next;
        }
    }
}

public static String getInetAddress() {
    try {
        Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
        InetAddress address = null;
        while (interfaces.hasMoreElements()) {
            NetworkInterface ni = interfaces.nextElement();
            Enumeration<InetAddress> addresses = ni.getInetAddresses();
            while (addresses.hasMoreElements()) {
                address = addresses.nextElement();
                if (!address.isLoopbackAddress() && address.getHostAddress().indexOf(":") == -1) {
                    return address.getHostAddress();
                }
            }
        }
        return null;
    } catch (Throwable t) {
        return null;
    }
}

}

注:来源于开源组件

相关文章

  • 生成30的全局ID

    public class TraceIdGenerator { } 注:来源于开源组件

  • 全局ID生成

    目前TTDL(Taobao Distrubute Data Layer )提供的ID生成主要还是依托数据库来进行...

  • 全局ID生成

    UUID uuid 由及部分组合当前日期和时间时钟序列全局唯一的IEEE机器识别码 优势简单,易用 不足占用空间大...

  • 高并发分布式系统中生成全局唯一Id汇总

    数据在分片时,典型的是分库分表,就有一个全局ID生成的问题。 单纯的生成全局ID并不是什么难题,但是生成的ID通常...

  • 分布式系统中生成全局唯一ID方案

    本文主要介绍在一个分布式系统中, 如何去生成全局唯一的 ID。 前言 单纯的生成全局ID并不是什么难题,生成全局的...

  • 全局id如何生成?

    很多时候我们都需要生成一个全局id用于数据存储的主键,那么如何生成一个全局id呢?有哪些方法?优缺点是啥? 0.r...

  • Redis-全局唯一ID

    零、本文纲要 一、全局唯一ID 二、Redis生成全局唯一ID1、snowflake算法全局唯一ID策略2、Red...

  • 设计分布式唯一id生成

    1. 生成全局唯一id 什么时候需要生成全局唯一id db不帮你自动生成的时候。比如: db做了分库分表,没帮你自...

  • 生成19的全局ID

    创建sequence 1.在Oracle数据创建sequenceCREATE SEQUENCE ID_SEQUEN...

  • 全局唯一ID生成策略

    Entrance 数据在分片时,典型的是分库分表,就有一个全局ID生成的问题。 单纯的生成全局ID并不是什么难题,...

网友评论

      本文标题:生成30的全局ID

      本文链接:https://www.haomeiwen.com/subject/hlgjmctx.html