-3

データベースへの入力ごとに「文字/数字」を増やす機能が必要です。INT データの AI のように。

のようなショートリンク コードを作成するには、これが必要ですsite.com/1gHrT

これを作る方法はありますか?

4

4 に答える 4

1

URL 短縮サービスは、base62 で大きな整数を使用することがよくあります。

整数は通常 base10 です (これは10 進法の別の単語、つまり[0-9]です)。他にも[0-1]base2 ( )、base8 ([ 0-8])、base16 ( ) などの一般的なシステムがあります[0-f]

base10 を超える場合は、英語の小文字のアルファベット ( [a-z]) を使用するのが通例です。したがって、base16 は[0-9a-f]( 0123456789abcdef) です。数字と小文字が処理できる範囲を超えてベースをプッシュする場合は、通常、大文字 ( [A-Z]) を使用します。したがって、base62 は を使用し[0-9a-zA-Z]ます。

PHP では、base_convert()関数は base2 から base36 (または ) まで何でも処理でき[0-1]ます[0-9a-z]

base36 を超えたい場合は、base62 まで何でも処理できるgmp拡張機能が必要です。拡張機能がインストールされていない場合は、インターウェブのどこかに機能を見つけることができるはずです。また、関数は関連しているように聞こえるかもしれませんが、この場合はそうではありません。これは、 base (またはradix )を変更することと同じではありません。gmpbase64_encode()

ただし、base62 は Web では少し脆弱である可能性があることに注意する必要があります。これは、小文字と大文字の両方に意味があるためです。つまり、頭のいい人が小文字の URI を好み、それを小文字に変換すると、その URI は間違った場所を指すことになります。この意味で、base36 ははるかに安全ですが、URI はそれほど短くはなりません (それほどではありませんが)。

ここで、投稿の数値を増やしたい場合は、それを base10 に変換し、増やしてから、元に戻すだけです。

実際にbase62にあると仮定すると、次のgmp関数を使用できます。

function base62_increment($number, $incrBy = 1) {
    if ( ! defined('GMP_VERSION'))
        throw new \Exception(__FUNCTION__.' needs the GMP extension');
    $number = gmp_init($number, 62);
    $number = gmp_add($number, $incrBy);
    return gmp_strval($number, 62);
}
$base62 = '1gHrT';
$incremented = base62_increment($base62);
var_dump($base62, $incremented);

base36 を使用する場合、またはgmp拡張機能がインストールされていない場合は、次を使用できますbase_convert()

function base36_increment($number, $incrBy = 1) {
    $number = base_convert($number, 36, 10);
    $number += $incrBy;
    return base_convert($number, 10, 36);
}
$base36 = 'esq2f';
$incremented = base36_increment($base36);
var_dump($base36, $incremented);

それはそれについてです。

于 2013-02-26T12:40:17.460 に答える
0

多分あなたは何かを求めていますか?

function randLetter()
{
return chr(97 + mt_rand(0, 25));
}

ソース: http://maymay.net/blog/2004/12/19/generating-random-letters-in-php/

于 2013-02-26T12:24:26.913 に答える
0

次のアルゴリズムのようなものを使用して、あるシステムの数値を別のシステムに変換するように、指定された文字を使用して数値を文字列に変換できます。

$n = 123; //your number

$chars = "abcdefghijklmnopqrstuvwxyz";
$chars = "0123456789" . strtoupper($chars) . $chars;
$b = strlen($chars);
$nums = array();
while ($n > 0) {
    $nums[] = $n % $b;
    $n = (int)($n / $b);
}

$nums = array_reverse($nums);
$out = "";
foreach ($nums as $num) {
    $out .= $chars[$num];
}

内部では数値カウンターを使用でき、出力はこのアルゴリズムで生成されます。

于 2013-02-26T12:24:35.913 に答える
0

テストされておらず、おそらく変換を回避するために最適化される可能性がありますが、これは数値を数字に変換しますが、連続した int を文字列に変換します。

$startval = 12435;
$maxval = 12654;

for ($i = $startval; $i < maxval; $i++) {
    $strINT = strval($i); // convert int to string
    // intialize final string to empty
    $strOutput = '';
    /* Loop through each letter */
    foreach (explode($strINT) as $letter) {
        // add 65 to each letter and turn it into a letter
        // letter A is character 65
        $strOutput .= chr(intval($letter) + 65);
    }
}
于 2013-02-26T12:50:19.970 に答える