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

标签 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;
    }
}

最佳答案

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

这几乎可以回答您的问题。你永远不能确定你的字符串是唯一的,除非你对照你的数据库检查它。绳子越长,机会就越渺茫。所以在你的情况下,我会创建一个 while 循环来检查数据库。从您保存在数据库中的第二个字符串开始,您可能(并且可能会在时间线的后面)连续命中两个随机生成的字符串。因此,在循环中检查唯一性,直到找到“唯一”的是一个好主意。像这样抽象的东西:

$token = generateToken();

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

请记住,没有 可以保证字符串的真正唯一性。您可以使用 MySQL UUID()UUID_SHORT()、PHP uniqid() 或任何其他生成随机字符串的工具。但它仍然不能保证上述唯一性,除非您将其与现有数据库进行核对。

关于php - 如何确保我的哈希值是唯一的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43910378/

相关文章:

php - 如何在 Laravel 的链接中检索 http get 参数?

java - 如何在数据库( hibernate )中计算表中的值?

PHP 将变量从 while 循环传递到另一个页面上的 Select 查询

Java 默认字符串哈希函数在单个字符串上产生冲突

php - 如何向两个不同的用户发送两个不同的消息phpmailer

php - 如果重复则更改数组值

php - WordPress 最近帖子的 MySql 查询需要链接到各个帖子

arrays - Lua的混合数组和哈希表;它存在于其他任何地方吗?

mysql - 为什么在oracle中引入散列分区?有什么好处

php - 如何在 PHP 的 for 循环中跳过迭代?