【问题标题】:Is the str::random() function in Laravel reliable for short URL?Laravel 中的 str::random() 函数对于短 URL 是否可靠?
【发布时间】:2021-07-25 09:08:46
【问题描述】:

我正在尝试在我的 Laravel 项目中创建一个简单的 url 缩短器。我只想使用小写和大写字母和数字作为短 url 地址。 (例如:sD7hY6g) Laravel 中“Illuminate\Support\Str”类下的“Str::random()”函数是否有可能返回这些字符以外的任何内容?我可以信任此函数还是需要创建自己的自定义函数?

(另外,无论我使用哪个函数,我都会在记录之前检查代码是否已经在数据库中。)

感谢所有提前回答的人。

【问题讨论】:

  • Str::random 不保证唯一性。最好使用不同的技术。
  • 非常感谢您的回复。事实上,似乎没有任何功能可以保证唯一性。因为根据我的研究,我必须在每条记录之前手动检查该代码是否已经在数据库中。我想在这里了解的是这个函数是否只会返回 URL 接受的字符。换句话说,我想知道除了小写字母和数字之外是否还有其他可能性。
  • Str::random() 使用 PHP 的 random_bytes 函数。我个人创建了自己的函数,易于管理,比Str::random()

标签: php laravel random laravel-8 short-url


【解决方案1】:

您应该相信Str::random() 总是返回一个字母数字字符串吗?是的。

该函数通过编码为base 64 数字来规范化其输出。代表基数 64 数字的 64 个符号是 ABCDEFGHIJKLMNOPQRSTUVWXYVabcdefghijklmnopqrstuvwxyz0123456789+\= 用于填充。

该函数还将\+= 替换为空(空格),这意味着Str::random() 的唯一可能输出是ABCDEFGHIJKLMNOPQRSTUVWXYVabcdefghijklmnopqrstuvwxyz0123456789


Laravel 5+'s Illuminate\Support\Str@random

public static function random($length = 16)
{
    $string = '';

    while (($len = strlen($string)) < $length) {
        $size = $length - $len;
        
        $bytes = random_bytes($size);
        
        $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size);
    }

    return $string;
}

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 2013-06-11
    • 1970-01-01
    • 2011-02-12
    • 2012-03-07
    • 2019-02-20
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    相关资源
    最近更新 更多