有关如何以编程方式为每个项目生成唯一键代码的问题?

时间:2014-05-07 03:40:30

标签: php mysql

我想为每个正在创建的项目生成唯一代码。我有一个HTML5网页,允许用户创建新项目,每个项目在成功创建时都会被分配一个唯一的代码。

我正在对Web服务器上的PHP文件进行Ajax调用,然后在MySql数据库中保存项目详细信息。我在表中有一列,为每个创建的项目存储唯一代码。

我很困惑如何创建此代码?它是用PHP还是我应该在MySql中完成。我希望它是一个独特的代码,客户将使用它来分发给他们的客户。

我尚未确定密钥的长度,但它应该在8位左右(char& int的组合很好)。我知道我可以在Java中使用HashTable来创建基于用户输入的代码,但我对PHP / MySql更新鲜。

有任何建议吗?

注意:我的目标是不应重复密钥

4 个答案:

答案 0 :(得分:1)

您可以使用PHP uniqid()生成唯一ID。但是,这不应该用于安全目的,如PHP手册中所述。有关详细信息,请go here

示例:

$unique_key = uniqid();

echo $unique_key; // Outputs unique alphanumeric key, like 5369adb278516

答案 1 :(得分:0)

生成代码:

// $length is the length of code you want to return
function generate_code($length) {
    $charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789012345678900987654321234567890";
    return substr(str_shuffle($charset), 0, $length);
}

要获取验证码,它会使用$code = generate_code(50)上生成的代码的参数调用user_code_exists()。

它会检查数据库是否至少有一行具有相同的值,如果行是0(代码不存在),它将返回true。

// Do generate and verify code existence
$verification_code = "";
while($this->user_code_exists($code = generate_code(50)) == true) {
    $verification_code = $code;
    break;
}

public function user_code_exists($code) {
    $query = $this->db->prepare("SELECT verification_code FROM accounts WHERE verification_code = :verification_code");
    $query->execute(array(':verification_code' => $code));
    return ($query->rowCount() == 0) ? true : false;
}

在while循环中,一旦返回true,变量$verification_code将保存唯一生成的代码。

这只是一个概述,我希望这有帮助。

答案 2 :(得分:0)

请参阅此问题的答案:

What is the best way to create a random hash/string?

特别是,如果你想要一个纯随机值(而不是项目名称的哈希值),那么请查看@ Gajus Kuizinas的答案,除了使用base64_encode而不是binhex给出一个更短但仍然可读的值:

base64_encode(mcrypt_create_iv(8, MCRYPT_DEV_URANDOM));

将为您提供11个字符:NTM2OWI0YzR

或者,如果您没有安装mcrypt库,请尝试:

base64_encode(hex2bin(uniqid()."0")); // Derived from microtime (the "0" is needed since uniqid() gives an odd number of characters
在丢弃尾随' =='

后,

会给出10个字符:U2m5vF8FAA

如果您希望对项目代码永不重复感到偏执,请在MySql表中的列中添加唯一索引,该列存储创建的每个项目的唯一代码,如果插入表中失败,则重复生成数字。

如上面的@Mark M所述,如果您担心安全性或伪装现有项目代码的人,请参阅上面related question链接中的@Anthony Forloney的回答。特别是:

  

一次使用的数字(NONCE) - 它们用于防止请求   未经授权的访问,他们发送一个密钥并检查每个密钥   使用代码的时间。

     

您可以在PHP NONCE Library from FullThrottle Development

查看更多信息

答案 3 :(得分:0)

我需要做类似的事情,一个保持唯一ID的解决方案,我最终得到了一个使用PHP函数time()的解决方案$reference_number = 'BFF-' . time();这样你可以改变 BFF 对您的业务逻辑更有意义的事情。这样我就不必担心之前是否会采用正在生成的新ID。

我希望这会有所帮助