【发布时间】:2017-05-11 08:33:36
【问题描述】:
我正在创建简短的 5 个字符散列来为我的学生打造独特的教室......典型的散列看起来像 AJ678。
我正在生成这样的哈希:
public function generateToken($length = 5)
{
return strtoupper(substr(md5(rand()), 0, $length));
}
我预计在应用程序的整个生命周期中会生成数千个教室...所以最终会发生冲突...我想知道如何确保每个哈希都是唯一的。
我已将 token 字段设为唯一字段。
我认为最好的方法是生成哈希,然后检查哈希是否已存在于我的数据库中,如果存在则生成新的哈希,否则使用哈希。
这是正确的做法吗?
编辑:我对实现一个调用自身的函数有点不安全......这看起来对吗?
public function generateToken($length = 5)
{
$token = strtoupper(substr(md5(rand()), 0, $length));
if ($this->tokenExistsAlready($token)) {
$this->generateToken();
} else {
return $token;
}
}
public function tokenExistsAlready()
{
$this->db->where('token', $token);
$query = $this->db->get('classes');
if ($query->num_rows() > 0) {
return true;
} else {
return false;
}
}
【问题讨论】:
-
如你所说,当它生成一个令牌时,检查它是否已经存在于数据库中,否则生成一个新的。
-
我建议使用时间戳和 id(或您可能拥有的其他主键),您可能不会得到重复的令牌或检查 uniqid()
-
@Ian,我已经用一些代码更新了我的问题,不确定你是否熟悉 PHP……看起来对吗?
-
看起来不错,但有一种稍微不同的方法可以节省您的查询:使您的令牌列唯一。用它执行你的 UPDATE/INSERT 指令,如果你收到一个违反约束的错误,再做一次。这样您就不必先检查。
-
错误:您应该在递归调用中将
$length传回。否则,当要求 len 6 时,有些人会返回 len 5。
标签: php mysql hash token unique