不如 ID 还是按顺序自增,但是提供给用户的时候,在末尾加一位数用作校验? 效果应该类似于,每两个 ID 之间平均间隔 10 个黑洞 校验值可以用任意算法加密 ID ,然后 mod 10 得到..
推广一下,可以用 id * N + (encrypt(id) % N) 得到带校验码的 id_v 服务器收到 id_v 以后,用 id_v / N 得到原 ID , 然后用 id_v % N == encrypt(id, key) % N 判断是否正确。 ( N >= 2 ,越大掺的洞越多(
dallaslu
2015-11-12 20:06:53 +08:00
1. 使用自增 ID ,记为 A ; 2. 生成 UUID ,去掉前面的 0 ,再取前 X 位按 16 进制转为 10 进制的值,记为 B ; 3. 计算 X 位 16 进制数字的 10 进制值的数字个数(如 4 位 16 进制数字 FFFF 10 进制值为 65535 ,数字个数为 5 ),记为 C ; 4. 在 B 的前面补 0 ,以使长度等于 C ,将其记为 D ; 5. 把 A 和 D 拼接起来,用做外显 ID 。
比如设 X 为 4 , A 为 235554 , UUID 为 3FE4C8B33C ...,则:
B = 0x3FE4 = 16356 ; C = 5 ; D = 16356 ; ID = 23555416356