是一個非常奇特的線上服務,它的目标不是解決一個問題,而是提出一個疑問:當我們把整個文檔儲存在 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