puzhibing
2026-04-20 af5ffb2c572c3188052b0d4b37c4bcec43f11c7d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.xiaopeng.maintenance.config;
 
import cn.hutool.core.lang.Snowflake;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import java.util.Date;
 
@Configuration
public class SnowflakeConfig {
 
    //初始时间戳,设为2026年1月1日0点0时0分
    public static final Date EPOCH_DATE = new Date(1767225600000L);
    /**
     * 如果配置为<0的值,则woker-id根据pod名的hash取模生成
     * 如果配置为>=0的值,则取配置的值
     * 如果多个pod的data-center-id和worker-id相同,同一毫秒内请求数上千的话,可能会产生碰撞,生成一样的snowflake id
     */
    @Value("${snowflake.worker-id:-1}")
    private long workerId;
 
    @Value("${snowflake.data-center-id:0}")
    private long dataCenterId;
 
    @Bean("hutoolSnowflake")
    public Snowflake snowflake() {
        long resolvedWorkerId = resolveWorkerId();
        return new Snowflake(EPOCH_DATE, resolvedWorkerId, dataCenterId, false);
    }
 
    private long resolveWorkerId() {
        if (workerId >= 0 && workerId <= Snowflake.MAX_WORKER_ID) {
            return workerId;
        }
        String podName = System.getenv("HOSTNAME");
        if (podName == null || podName.isEmpty()) {
            return 0;
        }
        int end = podName.length() - 1;
        while (end >= 0 && Character.isDigit(podName.charAt(end))) {
            end--;
        }
        String numberPart = podName.substring(end + 1);
        long candidate;
        if (!numberPart.isEmpty()) {
            try {
                candidate = Long.parseLong(numberPart);
            } catch (NumberFormatException e) {
                candidate = Math.abs(podName.hashCode());
            }
        } else {
            candidate = Math.abs(podName.hashCode());
        }
        return candidate % (Snowflake.MAX_WORKER_ID + 1);
    }
}