我想为每个正在创建的项目生成唯一代码。我有一个HTML5网页,允许用户创建新项目,每个项目在成功创建时都会被分配一个唯一的代码。
我正在对Web服务器上的PHP文件进行Ajax调用,然后在MySql数据库中保存项目详细信息。我在表中有一列,为每个创建的项目存储唯一代码。
我很困惑如何创建此代码?它是用PHP还是我应该在MySql中完成。我希望它是一个独特的代码,客户将使用它来分发给他们的客户。
我尚未确定密钥的长度,但它应该在8位左右(char& int的组合很好)。我知道我可以在Java中使用HashTable来创建基于用户输入的代码,但我对PHP / MySql更新鲜。
有任何建议吗?
注意:我的目标是不应重复密钥
答案 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) - 它们用于防止请求 未经授权的访问,他们发送一个密钥并检查每个密钥 使用代码的时间。
查看更多信息
答案 3 :(得分:0)
我需要做类似的事情,一个保持唯一ID的解决方案,我最终得到了一个使用PHP函数time()
的解决方案$reference_number = 'BFF-' . time();
这样你可以改变 BFF 对您的业务逻辑更有意义的事情。这样我就不必担心之前是否会采用正在生成的新ID。
我希望这会有所帮助