【问题标题】:Algorithm to generate a user unique, 6-character confirmation code?生成用户唯一的 6 字符确认码的算法?
【发布时间】:2012-05-23 13:01:15
【问题描述】:

我希望能够创建一个算法来生成一个 6 个字符的确认代码(例如 A1JU2Z),该代码对于给定的(用户、代码)对来说是唯一的。原因是,我想将代码保留为 6 个字符,但使用一组修剪过的字母数字(以避免与 1 和 I 等混淆)仅允许在发生冲突之前约 3 亿个代码。当然,我可能永远不需要 3 亿个代码,但如果我这样做了,回去修复这个问题将是一个巨大的痛苦。

那么有没有办法利用用户......说出他们的用户名,通用唯一代码,这样如果同一个用户想要生成另一个代码,它保证它对他们来说是唯一的? (这当然是假设单个用户不会生成超过 300 个工厂代码)

谢谢!

【问题讨论】:

  • (user, code) 对中的 code 来自哪里?
  • @Attila - 我的措辞可能很糟糕,但基本上我希望能够使用用户的用户名(例如)+其他一些序列来生成代码。所以全球唯一的(用户名,确认码)对。
  • 我认为用户名+确认码总是超过6个字符。
  • 我问的原因是,如果您生成一个对给定用户(但不一定是用户之间)唯一的ID,那么 (user, ID) 已经保证在全球范围内是唯一的。或者您希望 ID 在全局唯一的同时还包含用户的 ID?
  • @Attila - 我希望能够为给定用户生成多个 ID,这些 ID 不需要全局唯一,但对于该用户必须是唯一的。我希望能够在数学上做到这一点以避免数据库查找(尽管这听起来可能是不可避免的)。

标签: encoding hash uniqueidentifier


【解决方案1】:

如果 ID 仅对当前用户唯一,则可以随机生成 ID 的每个字符。只要不期望用户生成大量此类 ID,您就有合理的机会不会多次生成相同的 ID(您需要进行一些数学运算以获得预期碰撞机会的确切数字,因为生成的 ID 数量增长)。

如果您绝对不能不惜一切代价发生冲突,您需要保留所有以前生成的 ID 并为新的 ID 进行比较,或者保留生成的 ID 的计数(这需要ID 生成是基于计数确定性的方案,但也是唯一的 - 一个非常简单的情况是 {ID=count; ++count;})

【讨论】:

    【解决方案2】:

    我认为您可以使用这样的简单密码生成器:http://www.webtoolkit.info/php-random-password-generator.html

    结合检查算法以确保它尚未被使用。

    $pass=generate_password();
    $found=find_password($pass);
    while($found){
        $pass=generate_password();
        $found=find_password($pass);
    }
    save_password($user,$code,$pass);
    

    generate_password() 是链接中引用的函数。 find_password() 是一个你必须编写的函数来检查数据库中已经生成的代码。 save_password() 是您必须编写的一个函数,用于将生成的代码存储在数据库中。

    代码在 PHP 中,但逻辑在这里。 链接里的密码生成器通俗易懂,可以得到6个字符长,有你想要的字符规则。

    【讨论】:

    • 嗨,我想避免“确保它尚未使用”步骤。基本上,我想要一种算法/数学方法来为用户生成一个唯一代码,作为该用户用户名的函数。
    • 所以您正在搜索哈希算法(md5,sha1)。 6个字符,碰撞风险很大。对我来说最简单的方法是从 md5 或其他哈希算法结果中获取 6 个字符。
    猜你喜欢
    • 1970-01-01
    • 2013-05-04
    • 2012-02-09
    • 2017-06-17
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多