2012-09-08 55 views
-1

我想在c#和asp.net mvc中創建一個url shortener系統。我知道哈希表,我知道如何創建一個重定向系統等問題是索引長數據庫中的URL。一些網址可能長達4000個字符,並且似乎索引這種類型的字符串是一個壞主意。問題是:如何爲每個網址創建一個唯一的短字符串?例如MD5可以幫助我?每個字符串的MD5真的是獨一無二的嗎?爲每個唯一的長字符串創建一個簡短的唯一字符串

注:我看到的Gravatar使用MD5的電子郵件,因此,如果每個電子郵件地址是唯一的,那麼它的MD5哈希值是唯一的。這樣對嗎?我可以爲網址使用相同的解決方案嗎?

+1

MD5是128位,所以它可能會足夠獨特。 –

+3

您尋求[完美哈希函數](http://en.wikipedia.org/wiki/Perfect_hash_function)以避免衝突。 – HABO

+0

@HABO不錯的文章和很好的解決方案。請張貼您的建議作爲答案,我會接受它。 –

回答

0

一個perfect hash function是一個保證不會發生衝突。由於您的應用程序無法容納哈希鏈,因此完美的哈希值就是要走的路。

+0

4k字符串的實用完美哈希是....? –

+0

@HenkHolterman - 實用完美的哈希值肯定是一個挑戰。最小的一個更是如此。由於OP要求我重新發布我的評論作爲答案,所以我這樣做了。它看起來像一個高級學位課程給我。 – HABO

2

您可以使用MD5或SHA-1這樣的目的,你的描述。

哈希不完全是唯一的。舉個例子,如果你有4000個字節的數組,這意味着你可能有256^4000個組合。而MD5已經有了256^16的組合。所以,有可能發生碰撞。但是,對於所有實際目的(密碼學除外),您不必擔心碰撞。

如果您有興趣到真正的關於MD5的collission漏洞(與密碼學應用),你可以做到這一點here

0

已經提到將正常工作創造獨特的短字符串,這將可能唯一標識哈希方法你URL的。但是,我想提出一種替代方法。

具有兩列,ID(一個整數)和URL(字符串)創建的數據庫表。在表格中爲您要跟蹤的每個網址創建一行。然後,通過它的ID引用每個URL。使ID自動遞增,這將確保唯一性。

這解決了如何從縮短版的加長版本翻譯的問題:只需在數據庫中的表連接。使用散列,這將成爲一個問題,因爲散列是單向的。結果頁面標識也將會比MD5哈希短,將只包含數字,使他們很容易在URL查詢字符串包括等

+0

謝謝。但看起來你沒有看過這個問題。我知道這個工作人員,我的probelem正在索引url。索引長字符串不好。但是,再次感謝 –

+0

您的問題並不清楚,因爲您尚未定義「索引」的含義。你可以提到很多東西。除非您提供關於您想要做什麼的更多真實世界的細節,否則很難給出適當的答案。在我看來,你試圖做的事根本無法工作,因爲你不能將哈希值轉換回URL。很難看出你的問題涉及哪些現實世界的問題。 –

+0

如果您的問題與爲RDBMS表中的URL構建RDBMS索引有關,那麼我建議您使用一些特定於RDBMS的方法,如散列索引。 –

0

我想你可以嘗試從URL字符串,使一個字節(每字符可以是一個字節)數組,然後使用編碼(例如Base64,或者如果你想走得那麼遠,你可以自己創建一個),然後如果你想解碼,只需使用base 64解碼並從字節數組)再次chars。不過,我不確定,這將是一個很長的字符串或不,但我很確定它會是唯一的。

(PS你應該OFC應用一些邏輯首先像往常一樣刪除HTTP://並重新添加它解碼時)

相關問題