美文网首页
邀请码生成

邀请码生成

作者: 张广旭 | 来源:发表于2021-03-18 14:57 被阅读0次

游戏社交部分往往需要邀请码。以下是我的实现。供参考。其中有一些依赖的框架的特定代码,但不影响理解逻辑。值得强调的点是,去掉了几个在显示时容易混淆的字符。

import "math/rand"

const (
    invitationCodeMinLength = 6
    invitationCodeMaxLength = 10
    // 排除的字符包括:数字0和1,大写字母D、I和O,小写字母l和o
    invitationCodeChars = `23456789ABCEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz`
)

func GenInvitationCode() (string, err2.AppError) {
    for i := invitationCodeMinLength; i <= invitationCodeMaxLength; i++ {
        for j := 0; j < 3; j++ {
            code := randCodeWithLen(i)
            u, err := isUnique(code)
            if err != nil {
                return "", err
            }
            if u {
                return code, nil
            }
        }
    }
    return "", err2.AppErrorFromProtoEnum(msg.ErrorCode_SERVICE_INTERNAL_ERROR)
}

func randCodeWithLen(length int) string {
    cs := make([]byte, 0, length)
    for i := 0; i < length; i++ {
        n := rand.Intn(len(invitationCodeChars))
        c := invitationCodeChars[n]
        cs = append(cs, c)
    }
    return string(cs)
}

func isUnique(code string) (bool, err2.AppError) {
    // 查询数据库
}

下面是单元测试。

func Test_randCodeWithLen_dup(t *testing.T) {
    a := assert.New(t)
    const count int = 1e8
    codes := make(map[string]struct{}, count)
    var dupCount int
    for j := 0; j < count; j++ {
        var dup bool
        for i := invitationCodeMinLength; i <= invitationCodeMaxLength; i++ {
            code := randCodeWithLen(i)
            a.Equal(i, len(code))
            if _, ok := codes[code]; ok {
                dup = true
            } else {
                dup = false
                codes[code] = struct{}{}
                break
            }
        }
        if dup {
            dupCount++
        }
    }
    t.Logf("count=%d, dupCount=%d", count, dupCount)
}

一亿次生成,重复次数为0。可以说明重复的概率很低。
建表脚本如下。

CREATE TABLE IF NOT EXISTS `invitation_code` (
    `code` VARCHAR(10) NOT NULL,
    `uid` BIGINT UNSIGNED NOT NULL DEFAULT 0,
    PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

相关文章

  • 邀请码生成

    游戏社交部分往往需要邀请码。以下是我的实现。供参考。其中有一些依赖的框架的特定代码,但不影响理解逻辑。值得强调的点...

  • 用户邀请码生成

    业务场景:一般为已有用户生成邀请码给新用户使用,之后两者都会得到相应奖励。要求必须唯一,并且尽可能短,一般为5-9...

  • java生成邀请码

    喜欢的小伙伴们可以点点关注,文章结尾有惊喜礼包等着您喔!!! package com.gzjf.twsapi.ut...

  • 2019-06-17 邀请码的生成(基于自增id与多进制方案)

    项目开发过程中,偶尔会有邀请码需求。1.生成唯一邀请码2.得到邀请码的用户可以体验某项业务 这里分享一下邀请码的生...

  • [code snippet]生成邀请码

    参考用 Python 生成随机的邀请码 正如参考中所述,邀请码不仅要能够防止客户端伪造,还要方便服务端验证。 我大...

  • javascript随机邀请码生成

  • 6位邀请码生成

    背景:邀请是一种常见的裂变方式,这里生成全局唯一的6位邀请码。思路:由 0-9 加上24个大写字母(去掉容易混淆的...

  • 二维码的生成和使用

    开篇 二维码在软件中的应用算是比较普遍的,常见的比如生成二维码名片,扫码支付,扫码生成邀请码等一系列操作。最近一直...

  • php,js常用函数

    随机生成8位数不重复邀请码 public function getcode(){ return sprintf('...

  • 推推客合伙人依靠拼多多玩出了新高度

    邀请码161610 邀请码161610 邀请码161610 邀请码161610 邀请...

网友评论

      本文标题:邀请码生成

      本文链接:https://www.haomeiwen.com/subject/tyaucltx.html