0

是否可以缩放从https://stackoverflow.com/a/9848014/2704706获取的以下函数,以将数字编码/解码为 11 个字符串?

function lfsr($x) {
    return ($x >> 1) ^ (($x&1) ? 0xe10000 : 0);
}
function to_4($x) {
    for($i=0;$i<24;$i++)
        $x = lfsr($x);
    $str = pack("CCC", $x >> 16, ($x >> 8) & 0xff, $x & 0xff);
    return base64_encode($str);
}

function rev_lfsr($x) {
    $bit = $x & 0x800000;
    $x = $x ^ ($bit ? 0xe10000 : 0);
    return ($x << 1) + ($bit ? 1 : 0);
}
function from_4($str) {
    $str = base64_decode($str);
    $x = unpack("C*", $str);
    $x = $x[1]*65536 + $x[2] * 256 + $x[3];
    for($i=0;$i<24;$i++)
        $x = rev_lfsr($x);
    return $x;
}

for($i=0; $i<256; $i++) {
    $enc = to_4($i);
    echo $enc . " " . from_4($enc) . "\n";
}

我的最终目标是使用这些方法来形成具有编码 ID 的 URL,其方式与 YouTube URL 中 v $_GET 变量中包含的视频 ID 类似,即http://www.youtube.com/watch?v中的 RArlg6HeZZM =RArlg6HeZZM .

提前谢谢。

4

1 回答 1

0

我不知道 youtube 在做什么,但我会这样做:随机生成一个固定长度的字符串,尝试将其插入到主键所在的表中,如果出现主键异常错误,生成一个新字符串并尝试再次插入。继续这样做,直到您最终成功插入(即一个不在表中的随机字符串)。我实际上确实在一个应用程序中使用了它。

编辑: -

或者您可以将其添加为唯一字段而不是主键:

 alter table tbl add randomstring  varchar(11) unique;

然后你仍然可以有一个 auto_increment 数字作为主键。

于 2013-08-21T19:14:20.837 回答