在PHP中使用LFSR生成YouTube风格的ID

在PHP中使用LFSR生成YouTube风格的ID,php,algorithm,url,encoding,Php,Algorithm,Url,Encoding,是否可以将以下函数从扩展到编码/解码成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

是否可以将以下函数从扩展到编码/解码成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";
}
函数lfsr($x){
返回($x>>1)^($x&1)?0xe10000:0;
}
函数到_4($x){
对于($i=0;$i>16,($x>>8)和0xff,$x和0xff);
返回base64_编码($str);
}
功能版次lfsr($x){
$bit=$x&0x800000;
$x=$x^($bit?0xe10000:0);

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

编辑:--

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

 alter table tbl add randomstring  varchar(11) unique;

然后,您仍然可以使用一个自动递增的数字作为主键。

使用散列算法有助于将字符串“缩减”为较小的值;但您可能希望使用查找“转到另一个方向”。实际上,我想使用一种类似于上面提到的编码算法,而不是散列算法,这样我可以将ID解码回其原始数字表示形式。您可以使用PHP中可用的任何加密函数,首先将序列号转换为适当长的字符串。11个字符的base-64大概是64位,或8个字节,这是一个方便的加密块。好吧,听起来不错。你能告诉我如何将我在原始问题中包含的函数从构建4个字符的字符串更改为构建11个字符的字符串吗?我对位重排序和异或的理解严重不足。我不知道我知道很多PHP。但我想你可以这样做:
$c11=base64\u编码(mcrypt\u加密(mcrypt\u河豚,'AbCdEfG',pack(“V2”,0,$seqno),mcrypt\u MODE\u ECB”);
要拿回seqno,你需要颠倒整个过程:$array=unpack(“V2num”,mcrypt\u解密(mcrypt\u河豚,'AbCdEfG',base64\u decode($c11),mcrypt\u decode));$seqno=$array['num2'];`。这可能是完全错误的。谢谢你的建议。我更喜欢对自动递增的数字主键进行编码,而不是使用随机生成的字符串作为主键,因为它们允许更快的DB查找。请参阅我的编辑。只需将此字段添加为唯一字段而不是主键。我担心的是有人通过随机生成的字符串在我的应用程序中的$\u GET变量中调用aKieE9 Oadw。我将不得不使用随机字符串的列执行查询,而不是使用主键查询数据库,这将降低效率。