最近、現在の会社の都合により、就職活動を再開することになりました。面接の過程で、いくつかの興味深い質問にも遭遇しました。その時は何も考えていなかったのかもしれませんが、帰ってきてから改めて考えてみました。質問 1: ユーザーの ID (ID は長整数) を指定して、そのユーザー ID に基づいてユーザーの一意の招待コードを生成します (招待コードの範囲 ([a-z0-9])? コードの実装!
いくつかのこと当時私が考えていた解決策は比較的単純です:
<?php function createCode($userId) { //方案一: $currentTime = time(); $code = "{$userId}{$currentTime}"; return $code; //方案二: while(true){ //获取一个随机字符串 $code = getRandString(8); //判断该字符串是否存在 if( ! checkExists($code)) return $code; } }
その時に思いついたいくつかの解決策は、ほとんどすべてこれら 2 つの解決策から発展したものでした
2 つの解決策の欠点:
オプション 1:文字列の長さが長すぎて、招待コードはすべてユーザー間で渡される必要があります。長すぎるとユーザーの記憶に役立ちません。
オプション 2: ランダムな文字列を生成するたびに、次のことを確認する必要があります。データベース内に既に存在します。サイズが大きいと、必然的に効率に影響を及ぼします。このソリューションは最適ではありません。
文字 a ~ z0 ~ 9 を直接考慮することができます。ユーザー ID を 16 進数に変換してみてはどうでしょうか?
コードの実装:
<?php function createCode($userId) { static $sourceString = [ 0,1,2,3,4,5,6,7,8,9,10, 'a','b','c','d','e','f', 'g','h','i','j','k','l', 'm','n','o','p','q','r', 's','t','u','v','w','x', 'y','z' ]; $num = $userId; $code = ''; while($num) { $mod = $num % 36; $num = (int)($num / 36); $code = "{$sourceString[$mod]}{$code}"; } //判断code的长度 if( empty($code[4])) str_pad($code,5,'0',STR_PAD_LEFT); return $code; }