Encoding 生成用户唯一的6字符确认码的算法?

Encoding 生成用户唯一的6字符确认码的算法?,encoding,hash,uniqueidentifier,Encoding,Hash,Uniqueidentifier,我希望能够创建一个算法,生成一个6个字符的确认代码(例如A1JU2Z),该代码对于给定的(用户、代码)对是唯一的。原因是,我希望将代码保持在6个字符,但使用一组经过修剪的字母数字(以避免与1和I等混淆)只允许在发生冲突之前使用约3亿个代码。当然,我可能永远都不需要3亿个代码,但如果我需要的话,回去解决这个问题将是一个巨大的痛苦 那么有没有一种方法可以利用用户。。。如果同一用户想要生成另一个代码,那么保证它对他们来说是唯一的?(这当然是假设单个用户生成的代码不超过300个) 谢谢 我认为您可以使用

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

那么有没有一种方法可以利用用户。。。如果同一用户想要生成另一个代码,那么保证它对他们来说是唯一的?(这当然是假设单个用户生成的代码不超过300个)


谢谢

我认为您可以使用这样一个简单的密码生成器:

与检查算法结合使用,以确保尚未使用该算法

$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个字符的长度,以及所需的字符规则。

我认为您可以使用如下简单的密码生成器:

与检查算法结合使用,以确保尚未使用该算法

$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个字符长。

如果ID仅对当前用户唯一,您可以随机生成ID的每个字符。只要用户不希望生成大量这样的ID,您就有合理的机会不多次生成相同的ID(您需要做一些数学计算,以获得随着生成ID数量的增加而发生冲突的预期机会的确切数字)


如果您必须不惜一切代价避免冲突,那么您需要保留所有以前生成的ID并对新ID进行比较,或者保留生成的ID的计数(这需要一个方案,其中ID生成基于计数是确定的,但也是唯一的——非常简单的情况是
{ID=count;++count;}

如果ID仅对当前用户唯一,则可以随机生成ID的每个字符。只要用户不希望生成大量这样的ID,您就有合理的机会不多次生成相同的ID(您需要做一些数学计算,以获得随着生成ID数量的增加而发生冲突的预期机会的确切数字)


如果您必须不惜一切代价避免冲突,那么您需要保留所有以前生成的ID并对新ID进行比较,或者保留生成的ID的计数(这需要一个方案,其中ID生成基于计数是确定的,但也是唯一的——非常简单的情况是
{ID=count;++count;}

(用户,代码)
对中的代码来自何处?@Attila-我的措辞可能很糟糕,但基本上我希望能够使用用户的用户名(例如)+其他序列生成代码。因此,全局唯一的(用户名、确认码)对。我认为用户名+确认码将始终超过6个字符。我询问的原因是,如果您生成的ID对给定用户是唯一的(但不一定在用户之间),那么(用户、ID)将保证全局唯一。或者,在合并用户ID的同时,您希望ID是全局唯一的吗?@Attila-我希望能够为给定用户生成多个ID,这些ID不需要全局唯一,但必须对该用户唯一。我希望能够在数学上做到这一点,以避免DB查找(尽管听起来这可能是不可避免的)。
(用户,代码)
对中的代码来自何处?@Attila-我的措辞可能很糟糕,但基本上我希望能够使用用户的用户名(例如)+其他序列生成代码。因此,全局唯一的(用户名、确认码)对。我认为用户名+确认码将始终超过6个字符。我询问的原因是,如果您生成的ID对给定用户是唯一的(但不一定在用户之间),那么(用户、ID)将保证全局唯一。或者,在合并用户ID的同时,您希望ID是全局唯一的吗?@Attila-我希望能够为给定用户生成多个ID,这些ID不需要全局唯一,但必须对该用户唯一。我希望能够在数学上做到这一点,以避免DB查找(尽管听起来这可能是不可避免的)。嗨,我希望避免“确保它尚未使用”步骤。基本上,我想要一种算法/数学方法,根据用户的用户名为用户生成唯一的代码。6个字符,碰撞风险大。对我来说,最简单的方法是从md5或其他哈希算法结果中获取6个字符。基本上,我想要一种算法/数学方法,根据用户的用户名为用户生成唯一的代码。6个字符,碰撞风险大。对我来说,最简单的方法是从md5或其他哈希算法结果中获取6个字符。