如何确保我的哈希值是独一无二的?

时间:2017-05-11 08:33:37

标签: php mysql hash token unique

我正在创建短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;
    }
}

3 个答案:

答案 0 :(得分:1)

首先,定义“唯一”。在我们的术语中,唯一​​的是任何长度的字符串,在您的数据库中尚不存在。

这几乎可以回答你的问题。您永远无法确定您的字符串是唯一的,除非您根据数据库进行检查。弦越长,机会越小。所以在你的情况下,我会创建一个while循环来检查数据库。从您保存在数据库中的第二个字符串开始,您可能(并且可能稍后将在时间轴中)连续点击两个随机生成的字符串。因此,检查循环中的唯一性,直到找到“唯一”循环,这是一个好主意。像这样抽象的东西:

$token = generateToken();

while(tokenExists($token))
{
    $token = generateToken();
}

请记住, nothing 可确保字符串的真正唯一性。您可以使用生成随机字符串的MySQL UUID()UUID_SHORT(),PHP uniqid()或其他任何内容。但除非您根据现有数据库进行检查,否则它仍然不能保证所说的唯一性。

答案 1 :(得分:0)

使用uniqid()函数

public function generateToken($length = 5)
{
    return strtoupper(substr(uniqid(md5(rand()), 0, $length)));
}

答案 2 :(得分:0)

令牌可以只是一个唯一的整数吗?使用包含单个AUTO_INCREMENT列的表格可以轻松生成。