天天看點

hashify.me 神奇的線上服務 将整個文檔存儲在 URL 中

Hashify

是一個非常奇特的線上服務,它的目标不是解決一個問題,而是提出一個疑問:當我們把整個文檔儲存在 URL 中時會發生什麼樣的事情?

hashify.me 神奇的線上服務 将整個文檔存儲在 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

項目首頁

繼續閱讀