根据用户id生成与之对应的唯一邀请码,范围为‘0-9A-Z’。
이 요구 사항의 초점은 굵은 부분에 있습니다. 즉, 사용자 수가 많을 경우 초대 코드를 데이터베이스에 저장할 필요가 없도록 초대 코드를 기반으로 사용자 ID를 추론해야 합니다. , 성능이 크게 향상될 수 있습니다.
무작위로 문자열을 생성한 후 문자열 끝에 사용자 ID를 붙여넣는데, 이렇게 하면 ID가 너무 뻔하고 쉽게 노출될 수 있으며, ID가 너무 길면 초대 코드가 너무 길어서 사용자 사용에 도움이 되지 않습니다.
그래서 생성된 문자열에 사용자 ID를 삽입하고, 문자마다 ID 번호를 삽입하면 됩니다. 이렇게 하면 ID가 문자열에 섞여 쉽게 노출되지 않습니다. 그러나 길이 문제는 최적화되지 않았습니다. 따라서 한 문자씩 걸러 삽입하면 한 문자마다 두 ID의 숫자가 삽입되도록 변경됩니다. 하지만 길이에는 큰 영향을 미치지 않는 것 같습니다.
생각하기: 십진수는 더 짧은가요, 아니면 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를 추론할 수 있다는 것입니다. code. 따라서 일부 최적화가 필요합니다.
Optimization
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!