根据用户id生成与之对应的唯一邀请码,范围为‘0-9A-Z’。
この要件の焦点は、太字の部分にあります。つまり、ユーザー数が多い場合、招待コードをデータベースに保存する必要がないように、招待コードに基づいてユーザー ID を推定する必要があります。 、パフォーマンスを大幅に向上させることができます。
ランダムに文字列を生成し、その文字列の末尾にユーザー ID を接続しますが、この方法では ID が明白になりすぎて簡単に公開されてしまい、ID が非常に長い場合は招待コードが非常に長いため、ユーザーの使用には適していません。
そのため、生成された文字列にユーザー ID を挿入し、1 文字おきに ID 番号を挿入することができます。この方法では、ID が文字列に混在し、簡単には公開されません。ただし、長さの問題は最適化されていません。したがって、1 文字おきに挿入する ID の番号は、1 文字おきに 2 つの ID の番号を挿入するように変更されます。ただし、長さはあまり変わらないようです。
考え: 10 進数は短いですか、それとも 16 進数ですか?
16 進数は比較的短いので、ユーザー ID を 10+26=36 の 16 進数に直接変換できるはずですよね?具体的なコードは次のとおりです:
function createCode($user_id) { static $source_string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $num = $user_id; $code = ''; while($num) { $mod = $num % 36; $num = ($num - $mod) / 36; $code = $source_string[$mod].$code; } return $code; }
招待コードは一意性を確保しており、長すぎないため、招待コードに基づいてユーザー ID を推測することもできます。ただし、欠点は、他のユーザーも招待に基づいて user_id を推測できることです。したがって、いくつかの最適化を行う必要があります。
最適化
0を削除して補数記号として使用します。たとえば、招待コードが4桁未満の場合、上位ビットに0を追加して、36桁のシステムを35桁のシステムにします。その場合、文字列の順序がスクランブルされるため、$source_string がわかっている場合は、正しい user_id を解決する方法がありません。
コードは次のとおりです:
function createCode($user_id) { static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ'; $num = $user_id; $code = ''; while ( $num > 0) { $mod = $num % 35; $num = ($num - $mod) / 35; $code = $source_string[$mod].$code; } if(empty($code[3])) $code = str_pad($code,4,'0',STR_PAD_LEFT); return $code; }
このようにして、user_idに対応する固有の招待コードが生成され、デコード関数が付加されます:
function decode($code) { static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ'; if (strrpos($code, '0') !== false) $code = substr($code, strrpos($code, '0')+1); $len = strlen($code); $code = strrev($code); $num = 0; for ($i=0; $i < $len; $i++) { $num += strpos($source_string, $code[$i]) * pow(35, $i); } return $num; }
関連推奨事項:
phpはランダムな固有の招待コード/割引を生成しますコード固定長
以上がユーザーIDから独自の招待コードを生成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。