realpg
2022-07-03 14:51:11 +08:00
比如 我给你设计个算法
把数据库的 ID 起始设置为 10000001 确保位数不会太短
首先,生成两个随机数字[0-9] 分别为 x 和 y
把 ID 拆分成个位数的数字数组
a b c d e f g h i ...
然后遍历数组,a 乘以 x b 乘以 y 以此类推 奇数偶数
得到的如果是一位数那么前面补 9 ,比如 a=4 ,x=2 4*2=8 则变为 98 因为 9*9=81 不会出现十位数是 9 的情况
结果记为
aa bb cc dd ee ff gg hh ii jj
把这些结果拼接起来得到
aabbccddeeffgghhiijj... 会是结果的两倍长度
然后将 x 和 y 分别插进去一个固定位置 可以多次插入起到混淆作用,自己定个位置
这个定位要基于最前面的位数,也要基于最后面的位数,可以重复
比如结果这么排列 输出一个纯数字字符串
axabbccddeeffgghhiijjkyk
另外,可以定义一个 hash 表,将 0 1 2 3 4 5 6 7 8 9 分别替换成一个字母,因为字母[A-Za-z]比数字多,可以一个数字有随机的多种表示法
最后得到一串莫名其妙的字符串用来传递
decode 时,用同样的表将字符串替换回数字
然后对应位置抽出 x 和 y
然后每两位读取出来,十位数是 9 替换成 0
然后分别按顺序除以 x 和 y 如果不能整除报错
然后拼接起来得到 ID