PHP:Short-id像Youtube,带盐
我需要对数据库ID进行编码/加密,并将它们附加到我的URL中。安全性不是我试图解决的问题,但我正在寻找具有适度安全性的东西。主要目标是拥有唯一且URL安全的短ID 下面的代码片段似乎可以满足我的需要(来自)PHP:Short-id像Youtube,带盐,php,encryption,hash,cryptography,Php,Encryption,Hash,Cryptography,我需要对数据库ID进行编码/加密,并将它们附加到我的URL中。安全性不是我试图解决的问题,但我正在寻找具有适度安全性的东西。主要目标是拥有唯一且URL安全的短ID 下面的代码片段似乎可以满足我的需要(来自) 函数编码($val,$base=62,$chars='0123456789abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz'){ //无法处理大于2^31-1=2147483647的数字 $str=''; 做{ $i=$val%$base;
函数编码($val,$base=62,$chars='0123456789abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz'){
//无法处理大于2^31-1=2147483647的数字
$str='';
做{
$i=$val%$base;
$str=$chars[$i]。$str;
$val=($val-$i)/$base;
}而($val>0);
返回$str;
}
函数解码($str,$base=62,$chars='0123456789abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz'){
$len=strlen($str);
$val=0;
$arr=数组翻转(str_split($chars));
对于($i=0;$i<$len;++$i){
$val+=$arr[$str[$i]]*pow($base,$len-$i-1);
}
返回$val;
}
回波编码(2147483647);//输出2lkCB1
我可能会稍微修改一下函数:
我将如何更改脚本,使其也可以使用盐?这是一个明智的想法吗?我是否会无意中增加碰撞的可能性等?如果要使数字id从字符串中不可用,可以使用salt。您应该能够在没有冲突的情况下取回id。凯文·范·佐内维尔德的帖子是一个好的开始。无论如何,检查唯一性。您是否可以使用PHP的
uniqid
函数从当前时间戳生成一个伪随机字符串?然后在上传时将这个字母数字字符串保存在视频记录中。我不认为@StackOverwownewbie正在进行视频上传,他只是想要简短的唯一id“like”youtube。这个原则仍然适用。只需使用uniqid并将其存储在记录中。我更多地考虑使用我的DB id并对其进行加密/编码。使用uniqid
会产生如下结果:4b3403665fea6
。它相当长;我在找一些简短的东西(例如,在电话里很容易跟别人说,等等)。这是一个非常好的功能。但是,如果我的ID转换为ara字母数字,而不仅仅是数字,那该怎么办?@axel,您可能可以使用pack
/unpack
,例如,这个的十进制版本:但是要注意1)大数字,正如KVZ在上面函数alphaID
的注释中所指出的,2)短:如果源字符串已经很短(例如,由于其生成算法的原因),您可能无法获得较短的idi。我看不到“打包/解包”链接上的要点。例如,我需要将“PRV_IDPreventivoAuto”这样的字段转换为缩短的“n8nXn_ah5”,我甚至需要能够返回。@axel,可能“PRV_IDPreventivoAuto”不能缩短为“n8nXn_ah5”(或任何长度相同的字符串),假设输入和输出的字符空间相同。最好的选择是zip/gzip,但它们无法很好地压缩任意随机字符串(根据其定义)@axel,我所说的是关于的行:注意,在第16行,我们直接使用源十进制(而不是第15行的id)。这是因为alphaID
无法处理超过某个值的数字(请参见注释)。您可能会使用bc math获得一个有效的解决方案,但结果id可能会比输入的id长。您要做的是基本转换。如果您想要“salt”,您可以在之前使用参数化整数模糊处理。例如,只需一次调用即可完成所有这些操作。salt可以通过构造函数配置。
function encode($val, $base=62, $chars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
// can't handle numbers larger than 2^31-1 = 2147483647
$str = '';
do {
$i = $val % $base;
$str = $chars[$i] . $str;
$val = ($val - $i) / $base;
} while($val > 0);
return $str;
}
function decode($str, $base=62, $chars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
$len = strlen($str);
$val = 0;
$arr = array_flip(str_split($chars));
for($i = 0; $i < $len; ++$i) {
$val += $arr[$str[$i]] * pow($base, $len-$i-1);
}
return $val;
}
echo encode(2147483647); // outputs 2lkCB1