self::MAX_LENGTH) { throw new InvalidArgumentException("Length must be between " . self::MIN_LENGTH . " and " . self::MAX_LENGTH); } $base = strlen(self::CHARACTERS); $code = ''; do { $remainder = $number % $base; $code = self::CHARACTERS[$remainder] . $code; $number = intdiv($number, $base); } while ($number > 0); return str_pad($code, $length, self::CHARACTERS[0], STR_PAD_LEFT); } public function codeToInt(string $code): int { $base = strlen(self::CHARACTERS); $length = strlen($code); $number = 0; for ($i = 0; $i < $length; $i++) { $char = $code[$i]; $charIndex = strpos(self::CHARACTERS, $char); if ($charIndex === false) { throw new InvalidArgumentException("Invalid character in code"); } $number = $number * $base + $charIndex; } return $number; } public function generateRandomInt(int $length): int { if ($length < self::MIN_LENGTH || $length > self::MAX_LENGTH) { throw new InvalidArgumentException("Length must be between " . self::MIN_LENGTH . " and " . self::MAX_LENGTH); } $base = strlen(self::CHARACTERS); $maxNumber = bcpow($base, $length) - 1; return random_int(0, $maxNumber); } }