雪花算法id

2023/5/4

# 1 基于雪花算法生成的长整型ID

@Component
public class IdGeneratorSnowflake {

    /**
     * 工作节点ID,用于标识分布式系统中的某一特定机器,可通过机器IP地址转换得到
     */
    private long workerId = 0;
    /**
     * 数据中心ID,用于标识分布式系统中的某一特定数据中心,可根据实际数据中心划分策略设定
     */
    private long datacenterId = 1;
    private Snowflake snowflake = IdUtil.getSnowflake(workerId, datacenterId);

    /**
     * Spring框架启动后自动调用此方法,进行初始化工作
     */
    @PostConstruct
    public void init() {
        try {
            // 获取当前服务器IPv4地址并转换为长整型数字作为工作节点ID
            workerId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());
        } catch (Exception e) {
            // 若出现异常,可选择使用本地主机字符串哈希值作为备用的工作节点ID
            e.printStackTrace();
            workerId = NetUtil.getLocalhostStr().hashCode();
        }
    }

    /**
     * 获取下一个全局唯一ID
     * @return 返回一个基于雪花算法生成的长整型ID
     */
    public synchronized Long snowflakeId() {
        return snowflake.nextId();
    }

}