求助一下,生成一个不重复的6位短ID,用作邀请码?

dmwin72015 · · 3549 次点击
设定初始值和步长、打乱映射规则可以一定程度缓解这个问题。 从123开始自增,每次自增2。 1转换为9,2转换为5,3转换为7,那么自增id 123映射成短ID是957。实际使用中还会混合大小写字母,总共26+26+10=62种字符,你打乱后,完全猜出来是很难的。 更进一步,每次从mysql/redis拿一批id,在本地从这批id中随机取,这样别人既无法推测当前使用情况,也无法计算增长规律。
#10
更多评论
redis或者mysql自增id,然后映射成六位字符串
#1
` var b58Alphabet = []byte("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ") func demo2() { var b58Alphabet = []byte("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ") t := time.Now() rand.Seed(time.Now().Unix()) m := make(map[string]struct{}) total := 1000000 a := 0 for { id := make([]byte, 6) for i := 0; i < 6; i++ { id[i] = b58Alphabet[rand.Int()%len(b58Alphabet)] } idstr := string(id) // 去除重复 // if _, ok := m[idstr]; ok { // continue // } m[idstr] = struct{}{} a++ if a >= total { break } } result := len(m) fmt.Println("生成", total) fmt.Printf("重复率%f\n", float64(total-result)/float64(total)) fmt.Println("用时", time.Since(t)) } `
#2