KKSU
2023-11-16 9ccc8ed81210b5c4fdc50e71af201c6741622b84
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package cc.mrbird.febs.common.utils;
 
import java.util.Random;
 
public class ShareCodeUtil {
 
    /**
     * 自定义进制(0,1没有加入,容易与o,l混淆)
     */
    private static final char[] r=new char[]{'q', 'w', 'e', '8', 'a', 's', '2', 'd', 'z', 'x', '9', 'c', '7', 'p', '5', 'i', 'k', '3', 'm', 'j', 'u', 'f', 'r', '4', 'v', 'y', 'l', 't', 'n', '6', 'b', 'g', 'h'};
//    private static final char[] rAccount = new char[]{'1', '2', '3', '4', '5', '6', '7', '8', '9'};
    private static final char[] rInvitedId = new char[]{'1', '2', '3', '4', '5', '6', '7', '8', '9'};
    private static final char[] rAccount = new char[]{'q', 'w', 'e', '8', 'a', 's', '2', 'd', 'z', 'x', '9', 'c', '7', 'p', '5', 'i', 'k', '3', 'm', 'j', 'u', 'f', 'r', '4', 'v', 'y', 'l', 't', 'n', '6', 'b', 'g', 'h'};
 
    /**
     * (不能与自定义进制有重复)
     */
    private static final char b = '0';
 
    /**
     * 进制长度
     */
    private static final int binLen = r.length;
    private static final int binLenAccount = rAccount.length;
    private static final int binLenInvitedId = rInvitedId.length;
 
    /**
     * 序列最小长度
     */
    private static final int s = 32;
    private static final int sAccount = 6;
    private static final int sInvitedId = 8;
 
    /**
     * 根据ID生成32位随机密钥
     *
     * @param id ID
     * @return 随机码
     */
    public static String toSerialCode(long id) {
        char[] buf = new char[32];
        int charPos = 32;
 
        while ((id / binLen) > 0) {
            int ind = (int) (id % binLen);
            buf[--charPos] = r[ind];
            id /= binLen;
        }
        buf[--charPos] = r[(int) (id % binLen)];
        String str = new String(buf, charPos, (32 - charPos));
        // 不够长度的自动随机补全
        if (str.length() < s) {
            StringBuilder sb = new StringBuilder();
            sb.append(b);
            Random rnd = new Random();
            for (int i = 1; i < s - str.length(); i++) {
                sb.append(r[rnd.nextInt(binLen)]);
            }
            str += sb.toString();
        }
        return str;
    }
 
    /**
     * 根据ID生成六位随机码
     *
     * @param id ID
     * @return 随机码
     */
    public static String toSerialNumberCode(long id) {
        char[] buf = new char[32];
        int charPos = 32;
 
        while ((id / binLenAccount) > 0) {
            int ind = (int) (id % binLenAccount);
            buf[--charPos] = rAccount[ind];
            id /= binLenAccount;
        }
        buf[--charPos] = rAccount[(int) (id % binLenAccount)];
        String str = new String(buf, charPos, (32 - charPos));
        // 不够长度的自动随机补全
        if (str.length() < sAccount) {
            StringBuilder sb = new StringBuilder();
            sb.append(b);
            Random rnd = new Random();
            for (int i = 1; i < sAccount - str.length(); i++) {
                sb.append(rAccount[rnd.nextInt(binLenAccount)]);
            }
            str += sb.toString();
        }
        return str;
    }
 
    /**
     * 根据ID生成六位随机数字码
     *
     * @param id ID
     * @return 随机码
     */
    public static String toSerialNumberCodeTwo(long id) {
        char[] buf = new char[32];
        int charPos = 32;
 
        while ((id / binLenInvitedId) > 0) {
            int ind = (int) (id % binLenInvitedId);
            buf[--charPos] = rInvitedId[ind];
            id /= binLenInvitedId;
        }
        buf[--charPos] = rInvitedId[(int) (id % binLenInvitedId)];
        String str = new String(buf, charPos, (32 - charPos));
        // 不够长度的自动随机补全
        if (str.length() < sInvitedId) {
            StringBuilder sb = new StringBuilder();
            sb.append(b);
            Random rnd = new Random();
            for (int i = 1; i < sInvitedId - str.length(); i++) {
                sb.append(rInvitedId[rnd.nextInt(binLenInvitedId)]);
            }
            str += sb.toString();
        }
        return str;
    }
 
    public static long codeToId(String code) {
        char chs[] = code.toCharArray();
        long res = 0L;
        for (int i = 0; i < chs.length; i++) {
            int ind = 0;
            for (int j = 0; j < binLen; j++) {
                if (chs[i] == r[j]) {
                    ind = j;
                    break;
                }
            }
            if (chs[i] == b) {
                break;
            }
            if (i > 0) {
                res = res * binLen + ind;
            } else {
                res = ind;
            }
        }
        return res;
    }
}