2013-08-21 18 views
0
的LFSR

是否有可能从规模到https://stackoverflow.com/a/9848014/2704706编码采取了以下功能/解码的号码变成11字符串?生成的YouTube式的标识与PHP

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的网址,以类似的方式向包括在YouTube的URL中的V $ _ GET变量,即RArlg6HeZZM在http://www.youtube.com/watch?v=RArlg6HeZZM视频的ID。

提前致谢。

+1

使用散列算法有利于“减少”的字符串的东西小;但是你会想用查找来“走另一条路”。 – Floris

+0

我实际上喜欢使用类似于我上面包含的编码算法而不是哈希算法,这样我就可以将ID解码回原始数字表示。 –

+0

您可以使用PHP中的任何加密函数,首先将序列号转换为适当长的字符串。 base-64的11个字符大概是64位,或八个字节,这是一个方便的加密块。 – rici

回答

0

我不知道是什么,YouTube会,但我会做到这一点:随机生成一个固定长度的字符串,尝试将其插入到一个表,它的主键,如果你得到一个主键例外错误,生成一个新的字符串并尝试再次插入。继续这样做,直到最终获得成功的插入(即一个不在表中的随机字符串)。我实际上是在一个应用程序中使用它。

编辑: -

或者你可以将其添加为一个独特的领域,而不是主键:

alter table tbl add randomstring varchar(11) unique; 

那么你仍然可以有一个auto_increment号作为主键。

+1

感谢您的建议。我宁愿编码一个自动递增的数字主键,而不是使用随机生成的字符串作为主键,因为它们允许更快的数据库查找。 –

+0

看我的编辑。只需将此字段添加为UNIQUE而不是主键即可。 – developerwjk

+0

我担心的是有人将$ _GET变量中的随机字符串aKieE9-Oadw传递给我的应用程序。而不是使用主键查询数据库,我将不得不使用随机字符串的列来执行查询,这个列的效率必须更低。 –