如何确保我的哈希值是唯一的?

问题描述 投票:0回答:4

我正在创建简短的 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;
    }
}
php mysql hash token unique
4个回答
2
投票

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

这几乎回答了你的问题。您永远无法确定您的字符串是唯一的,除非您根据数据库检查它。绳子越长,机会就越小。所以在你的例子中,我会创建一个

while
循环来检查数据库。从保存在数据库中的第二个字符串开始,您可能(并且可能稍后会沿着时间线)连续命中两个随机生成的字符串。因此,在循环中检查唯一性直到找到“唯一”是一个好主意。像这样抽象的东西:

$token = generateToken();

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

请记住,没有任何东西保证字符串的真正唯一性。您可以使用 MySQL

UUID()
UUID_SHORT()
、PHP
uniqid()
或其他任何工具来生成随机字符串。但它仍然不能保证所述唯一性,除非您对照现有数据库进行检查。


0
投票

使用 uniqid() 函数

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

0
投票

令牌可以只是一个唯一的整数吗? 使用具有单个

AUTO_INCREMENT
列的表格很容易生成。


0
投票

我会使用局部变量和 WHILE 循环来避免递归函数调用:

public function generateToken($length = 5)
{
    $token_exists = true;
    while ($token_exists) {
        $token = strtoupper(substr(md5(rand()), 0, $length));
        $token_exists = $this->tokenExistsAlready();
    }
    return $token;
}
© www.soinside.com 2019 - 2024. All rights reserved.