在 Laravel 中如何生成唯一ID?

5

我正在使用 Laravel 开发毕业项目,需要生成一个最长只有 9 个字符的小型唯一标识符。我不需要使用 UUID,因为这会生成长度为 36 个字符的标识符,太长了。


请问您能否提供更多关于您所遇到问题的信息?您应该提供一部分出现问题的代码,社区会尝试帮助您,但是Stack Overflow的目的不是为您从头创建解决方案。 - siamsot
5个回答

25
你可以像这样使用PHP函数:
function unique_code($limit)
{
  return substr(base_convert(sha1(uniqid(mt_rand())), 16, 36), 0, $limit);
}

echo unique_code(9);

输出的样子是这样的:
s5s108dfc

以下是规格说明:
  • base_convert - 在任意进制之间进行转换。
  • sha1 - 计算字符串的 sha1 哈希值。
  • uniqid - 生成一个唯一的标识符。
  • mt_rand - 通过 Mersenne Twister 随机数生成器生成随机值。

或者在 Laravel 中,您可以使用 Laravel Str 库: 只需使用以下代码:

use Illuminate\Support\Str;
$uniqid = Str::random(9);

:::注意:::
尽管此功能可能在一定时间内生成唯一的代码,但不能保证始终生成唯一的代码。您应该每次都需要与系统中现有的代码进行交叉检查。

1
Str::random 方法是否有确保唯一性的功能? - Hashim Aziz
如果我只获取子字符串,那么这些字符串是否仍将保持唯一? - The Blind Hawk

5
你可以使用这个库生成随机字符串:
``` use Illuminate\Support\Str; $id = Str::random(9); ```

我应该把这个写在哪里?我该如何在数据库中处理它? - shrooq
你能告诉我更多关于目的方面的信息吗?这样我就可以更好地提供帮助。 - Marcos Messias
你能给我你的电子邮件吗?或者有什么账户可以通过它向你提问吗? - shrooq
这个是否有任何保证唯一性的措施? - Hashim Aziz

1
你可以使用这个,
$unique_id= echo floor(time()-999999999);

这将根据时间生成一个9位数字的唯一值。

0
生成自定义的唯一ID或代码(带前缀或后缀或两者都有或仅有唯一ID),或在Laravel框架中更改前缀或后缀或两者之后重置您的ID。
访问https://github.com/SirajCse/laravel-unique-id-generator 示例: Inv-000001/12/21
UniqueIdGenerator::generate(['table' => 'invoices','field'=>'invoice_id','length' => 16,'prefix' => 'Inv-', 'suffix' => date('/m/y')]);

'table' => 'invoices' [sting table name]
'field'=>'invoice_id' [Default 'id'] [Optional][any string field name]
'length' => 12 [Integer value Id length]
'prefix'=>'Inv-' [Default ''] [Optional] [any string]
'suffix'=>date('/m/y') [Default ''] [Optional][any string]
'reset_on_change'=>false[ Default false] [Optional] [Options are 1.prefix , 2.suffix 3.both 4.false]
uniqueId=000001

1
当链接到您自己的网站或内容(或与您有关联的内容)时,您必须在答案中披露您的关联,以便不被视为垃圾邮件。在用户名中具有与URL相同的文本或在个人资料中提及它不被视为足够的披露根据Stack Exchange政策。 - cigien

0

在 Laravel 中创建自定义辅助方法

它将根据条件生成序列随机数。

function generateSequenceNumber($tablename, array $conditions = [], string $prefix, int $length = 5): string
{
    $model = \DB::table($tablename);

    if (is_array($conditions) && count($conditions) > 0) {
        $model = $model->where($conditions);
    }

    return $prefix . str_pad(
            ($model->count()) + 1,
            $length,
            '0',
            STR_PAD_LEFT
        );
}


generateSequenceNumber('tablename',[],'prefix-',5); //prefix-00001
generateSequenceNumber('users',['role' => 'admin'],'admin-',5); //admin-00005
generateSequenceNumber('users',['is_active' => 1,'role' => 'client'],'client-',8);
 //client-00000008

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接