1

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

项目主页

http://hashify.me


编撰 SegmentFault


weakish
24.6k 声望844 粉丝

a vigorously lazy deadbeat with matured immaturity