Hashify 是一个非常奇特的在线服务,它的目标不是解决一个问题,而是提出一个疑问:当我们把整个文档储存在 URL 中时会发生什么样的事情?
原理
整个文档被储存在 URL 之中。Hashify 将 Unicode 通过 Base64 编码转化转化为 ASCII 字符。
> unescape(encodeURIComponent('ça va?'))
"ça va?"
> btoa(unescape(encodeURIComponent('ça va?')))
"w6dhIHZhPw=="
URL 长度限制
出乎一般人的意料,HTTP 规范并没有见限制 URL 的长度!这意味着 Hashify 可以储存任意长度的文档!
那么,浏览器是否有限制呢?大可放心,主流浏览器支持 80k 字符的 URL。例如 Chrome 在 215k 字符的 URL 时才会失去响应。
不过,服务器和代理等等的限制可能要更紧一些。
并且,由于 URL 过长,复制传播很不方便,因此 Hashify 使用了 bit.ly 来缩短网址。然而,bit.ly 对 URL 长度有 2048 字符的限制。对于大多数文档而言,这也足够了。如果文档很长的话,Hashify 会把内容切分,(最多切分成 15 份),然后将每份进行 Base64 转码并分别发送给 bit.ly。然后将 bit.ly 返回的结果组合起来:
http://hashify.me/unpack:gYi2Ie,g4fpte.
因此,Hashify 可以为 22,500 字符以下的文档生成短网址。
也就是说,22,500 字符以下的文档都可以将 bit.ly 作为存储空间!这真是对短网址生成服务绝妙的滥用!
API
已知 Hashify 网址的前提下,无需访问 hashify.me 网站便可获取文档内容,例如,使用 Python:
from base64 import b64decode
from urlparse import urlparse
def unhashify(url):
return b64decode(urlparse(url).path[1:])
unhashify('http://hashify.me/w6dhIHZhPw==')
部署
你可以直接在 http://hashify.me 上使用 Hashify 服务。当然,Hashify 是开源的,你也可以部署在自己的服务器上。
克隆仓库:
git clone https://github.com/hashify/hashify.me
安装 Compass:
gem update --system
gem install compass
安装依赖
make setup
构建
make
假设你使用 nginx 服务器,添加配置文件并激活,
ln -s "$(pwd)/nginx.conf" /opt/local/etc/nginx/sites-available/hashify.me
ln -s ../sites-available/hashify.me /opt/local/etc/nginx/sites-enabled/hashify.me
sudo nginx -s reload
项目主页
编撰 SegmentFault
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。