【发布时间】:2015-10-23 14:32:22
【问题描述】:
我是 laravel 5 的新手。我正在做一个项目,我想为每个应用程序分配一些随机可读的 unique 字符串。我知道可以用作种子的每个应用程序 ID。由于该应用程序将在公司内部使用,因此我不太担心安全性。我希望表大小会增长,所以我的目标是尽可能地实现唯一性,因为 DB 中的字段是唯一的。类似(EN1A20、EN12ZOV 等)的代码。如果该函数可以让我传递我想要返回的字符串的长度,那就太棒了。
编辑 下面显示的是我对这个问题的尝试
private function generate_app_code($application_id) {
$token = $this->getToken(6, $application_id);
$code = 'EN'. $token . substr(strftime("%Y", time()),2);
return $code;
}
private function getToken($length, $seed){
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "0123456789";
mt_srand($seed); // Call once. Good since $application_id is unique.
for($i=0;$i<$length;$i++){
$token .= $codeAlphabet[mt_rand(0,strlen($codeAlphabet)-1)];
}
return $token;
}
上面的代码可以解决问题吗?
编辑
实际上,我从这篇帖子PHP: How to generate a random, unique, alphanumeric string? 中借鉴了上面的方法,但这篇帖子并没有完全解决我的问题。我的目标是生成一个长度为 6 到 8 的字符串(字母数字且可读)。我的管理员将使用此字符串进行查询。在我的函数中,我有 mt_srand($seed) 为随机数生成器播种,其中种子是我的 application_id。有可能得到重复的$token。
感谢帮助。
【问题讨论】:
-
Str::random(6);仅在 laravel 中...
-
对于未来的 Google 员工,他们正在寻找仅适用于 laravel 的解决方案。我创建了这个模型方法,它利用 Laravel 助手并检查数据库是否存在。在这种情况下,它用于 API 密钥生成 -
public function generateApiKey() { do { // generate our new API key $key = 'key_' . str_random(32); } while (static::where('api_key', $key)->exists()); // return our newly generated API key return $key; }