根据用户id生成唯一邀请码的方法中这句扩散算法原理是?

根据用户id生成唯一邀请码的方法中这句扩散算法原理是?

背景

有个需求是根据每个用户的id生成每个人唯一的邀请码,在网上查阅资料后发现了下边这个【进制法+扩散+混淆】算法,代码如下:

const (

PRIME1 = 3 // 与字符集长度 62 互质

PRIME2 = 5 // 与邀请码长度 6 互质

SALT = 123456789 // 随意取一个数值

)

// GetInvCodeByUIDUniqueNew 获取指定长度的邀请码。

func GetInvCodeByUIDUniqueNew(uid uint64, l int) string {

// 放大 + 加盐。

uid = uid*PRIME1 + SALT

var code []rune

slIdx := make([]byte, l)

// 扩散。

for i := 0; i < l; i++ {

slIdx[i] = byte(uid % uint64(len(AlphanumericSet))) // 获取 62 进制的每一位值

slIdx[i] = (slIdx[i] + byte(i)*slIdx[0]) % byte(len(AlphanumericSet)) // 其他位与个位加和再取余(让个位的变化影响到所有位)

uid = uid / uint64(len(AlphanumericSet)) // 相当于右移一位(62进制)

}

// 混淆。

for i := 0; i < l; i++ {

idx := (byte(i) * PRIME2) % byte(l)

code = append(code, AlphanumericSet[slIdx[idx]])

}

return string(code)

}

// 示例

fmt.Println(GetInvCodeByUID(100000000, 6)) // d3ihcF

fmt.Println(GetInvCodeByUID(100000001, 6)) // giuqiI

fmt.Println(GetInvCodeByUID(100000002, 6)) // jxGzoL

问题

其中对这一句不太理解是什么原理,这是如何保证计算后所有的邀请码直接不会重的呢?

slIdx[i] = (slIdx[i] + byte(i)*slIdx[0]) % byte(len(AlphanumericSet)) // 其他位与个位加和再取余(让个位的变化影响到所有位)

自己实现脚本小批量测试后发现确实没有重复,但是这句不理解,是什么原理?

参考链接: https://blog.csdn.net/K346K34...


回答:

https://hashids.org/

这个我感觉更好. 有初始iv, 可编码, 可解码.

描述里的长度为6, 结果空间就那么大, 肯定会重复的.

以上是 根据用户id生成唯一邀请码的方法中这句扩散算法原理是? 的全部内容, 来源链接: utcz.com/p/938697.html

回到顶部