Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:Short-id像Youtube,带盐_Php_Encryption_Hash_Cryptography - Fatal编程技术网

PHP:Short-id像Youtube,带盐

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;

我需要对数据库ID进行编码/加密,并将它们附加到我的URL中。安全性不是我试图解决的问题,但我正在寻找具有适度安全性的东西。主要目标是拥有唯一且URL安全的短ID

下面的代码片段似乎可以满足我的需要(来自)

函数编码($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
我可能会稍微修改一下函数:

  • 删除$base参数;斯特伦可以解决这个问题($chars)
  • 从字符集中消除可能相互混淆的字母/数字(例如0、O、O)

  • 我将如何更改脚本,使其也可以使用盐?这是一个明智的想法吗?我是否会无意中增加碰撞的可能性等?

    如果要使数字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