Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/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 URL缩短:使用inode作为短名称?_Php_Url_Url Shortener_Short Url - Fatal编程技术网

Php URL缩短:使用inode作为短名称?

Php URL缩短:使用inode作为短名称?,php,url,url-shortener,short-url,Php,Url,Url Shortener,Short Url,我正在开发的网站希望生成自己的缩短URL,而不是依赖tinyurl或bit.ly这样的第三方 显然,我可以在新URL添加到站点时保持运行计数,并使用它生成短URL。但如果可能的话,我会尽量避免这种情况发生,因为要让这一点起作用似乎需要做很多工作 因为需要短URL的东西都是Web服务器上的真实物理文件,所以我当前的解决方案是使用它们的inode编号,因为这些编号已经为我生成,可以随时使用,并且保证是唯一的 function short_name($file) { $ino = @filein

我正在开发的网站希望生成自己的缩短URL,而不是依赖tinyurl或bit.ly这样的第三方

显然,我可以在新URL添加到站点时保持运行计数,并使用它生成短URL。但如果可能的话,我会尽量避免这种情况发生,因为要让这一点起作用似乎需要做很多工作

因为需要短URL的东西都是Web服务器上的真实物理文件,所以我当前的解决方案是使用它们的inode编号,因为这些编号已经为我生成,可以随时使用,并且保证是唯一的

function short_name($file) {
   $ino = @fileinode($file);
   $s = base_convert($ino, 10, 36);
   return $s;
}
这似乎奏效了。问题是,我能做些什么使短URL更短

在使用此功能的系统上,新添加文件的inode位于使上述函数返回7个字符长的字符串的范围内

我能安全地扔掉一些(一半?)inode的碎片吗?如果是,是高位还是低位

我曾想过使用文件名的crc32,但这实际上使我的短名称比使用inode长

像这样的东西有碰撞的危险吗?通过选择正确的“$referencefile”值,我已经能够精确到个位数


不确定这是否是一个好主意:如果您必须更改服务器,或更改磁盘/重新格式化它,则文件的inode编号很可能会更改。。。您所有的短URL都将被破坏/丢失

如果出于任何原因,您需要将文件移动到磁盘的另一个分区,顺便说一句,也是一样的


另一个想法可能是计算一些crc/md5/文件名,就像你建议的那样,并使用一些算法来“缩短”它

以下是几篇关于这方面的文章:


    • 肖恩·英曼退房;还没有玩过它,但它是一个自托管的滚动您自己的URL解决方案。

      相当巧妙地使用了那里的文件系统。如果您保证inode id是唯一的,那么这是一种生成唯一编号的快速方法。我想知道这是否可以在NFS上持续工作,因为显然不同的机器将有不同的inode编号。然后,只需序列化在那里创建的文件中的链接信息

      为了稍微缩短URL,您可能会考虑大小写敏感度,并进行一种安全编码(您将得到大约base62-10[0-9]+26(a-z)+26(a-z),或者如果您删除一些“冲突”字母,例如
      I
      vs
      l
      vs
      1
      …有很多示例/库)


      你还需要像你说的那样,用偏移量“回家”你的ID。您还需要弄清楚如何防止临时文件/日志文件等的创建占用您的键空间。

      这一点很好。URI的一个关键方面是它们永远不应该改变——这将违反它。另一个风险是无意中允许访问您不希望允许的数据。例如,假设用户请求inode 17,而这恰好是/etc/shadow(或者他们请求1111,这恰好是到/etc/shadow的链接)。您必须进行额外的检查,以确保该文件位于您期望的目录中,并且它可能不是完全琐碎的。。。
      function short_name($file) {
         $ino = @fileinode($file);
         // arbitrarily selected pre-existing file,
         // as all newer files will have higher inodes
         $ino = $ino - @fileinode($referencefile);
         $s = base_convert($ino, 10, 36);
         return $s;
      }