2011-08-19 100 views
2

首先,一些背景:如何實現無損URL縮短

我想實現我自己的服務器上的網址縮短(在C,如果該事項)。其目的是避免長URL,同時能夠從縮短的URL恢復上下文。

目前我有一個實現,在服務器上創建一個會話,由某個ID標識。這可以工作,但會消耗服務器上的內存(並且因爲它是一個資源有限的嵌入式服務器,而且設備的主要目的不是提供網頁,而是做其他很酷的事情,所以不需要)。

另一種選擇是使用cookiesHTML5 webstorage將會話信息存儲在客戶端中。

但我正在尋找的是可以將縮短的URL參數存儲在一個參數,我附加到該URL並能夠重新構建該參數的原始參數。

首先想到的是使用Base64 -encoding將所有參數合併成一個,但這會產生更大的URL。

目前,我正在考慮壓縮URL參數(使用一些壓縮算法像拉鍊BZ2,...),做好對壓縮的二進制BLOB使用Base64編碼,並利用這些信息作爲背景。當我得到參數時,我可以做一個Base64解碼,解壓縮結果,並在原始URL上進行操作。

的問題是:是那裏,我俯瞰,我可以用無損壓縮的URL參數大名單成一個單一的較小任何其他可能性?


更新:
的意見後,我意識到,我忽略了壓縮自身增加一些開銷,壓縮數據進行壓縮的數據甚至比因爲開銷的原始數據大例如zipping增加了內容。因此(如主頁在他的評論中聲明),我開始認爲,如果參數超過一定的長度,壓縮整個URL參數列表才真正有用,否則,我可能會得到一個偶數比以前更大的URL。

+0

我想只有一種方法可以做到這一點 - 使用查找表,就像您在會話中已經做的那樣。您的嵌入式服務器(db,文件系統)上沒有可用的外部存儲空間?最後你必須把信息存儲在某個地方,通過使它變小,你總是會丟失信息。 – home

+0

@home:如果我使用打包算法(zip,bz2),我不會丟失信息,對吧? – eckes

+0

是的,但它可能會炸燬你的URL的長度。只有非常長的URL纔會減少長度。我的意思是「更小」是從URL中刪除信息。幾周前我嘗試過 - zip> base64編碼,對我來說不起作用:-) – home

回答

2

您可以隨時推出自己的壓縮。如果你只是簡單地使用一些huffman編碼,結果總是會更小(但是然後base64編碼它,它會增長一點,所以淨效應可能不是最佳的)。

我在一個嵌入式項目上使用自定義壓縮策略,我首先使用了一個lzjb(一個lempel ziv派生程序,跟隨源代碼的鏈接,真正緊密的實現(來自open solaris)),接着是huffman編碼壓縮的結果。

lzjb算法在很短的輸入上表現不佳,但(〜16字節,在這種情況下,我將它保持爲未壓縮狀態)。