2011-04-28 80 views
3

就像一個有趣的項目,我想嘗試和爲我自己的個人使用做一個簡單的URL縮寫,但我想嘗試並結合我喜歡的其他shorteners喜歡bit.ly和這樣的東西。所以,當談到分配短網址ID時,我遇到了一些問題。生成獨特的8字符Hex字符串

現在我只是手動分配代碼,但我想自動化它。我可以通過簡單的方式分配增量ID(我認爲這可以通過在MySQL數據庫上使用指定的自動增量值完成,並且只使用URL的PHP​​ dechex()函數),但似乎其他縮略符是隨機的。

我知道我不會在數據庫中獲得荒謬的URL數量,但我仍然希望保持高效的流程,這使得創建隨機唯一的ID而非數據庫中的許多URL會造成負擔。我真的不知道如何去做一個系統來製作不會重複的ID,也不會運行緩慢。

回答

2

見:PHP short hash like URL-shortening websites,答案你可能想:http://blog.kevburnsjr.com/php-unique-hash

第二個鏈接可能特別有用,只是短暫散列當前ID。

+0

我喜歡這種方法,現在你和@ a3_nm已經說服了我。當然,它可能不是隨機的,可能不是8個字符,但我認爲我已經認識到系統將具有的一些限制以及它實際上只是一個有趣的項目。感謝你們的幫助,我將使用Base36或Base64系統來生成我的代碼。 – 2011-04-28 04:13:41

0

您可以隨時生成隨機ID,檢查它們是否已被分配,並在不太可能發生的情況下畫出一個新的ID,然後點擊已經使用過的ID。查看它們是否已被分配不應該很慢,因爲無論如何,每當有人查詢您的某個網址時,您都會這樣做。

如果你想要隨機的十六進制字符串,一個快速和骯髒的方法是生成一個隨機的大數字,使用SHA1或任何其他散列函數散列,並採取前8個字符。但我不明白爲什麼要使用十六進制而不是隨機的base64,因爲base64允許你將更多的URL包裝成更少的字符。 [實際上,您可能希望通過散列URL來生成ID - 如果使用安全加密哈希,應該像散列隨機值一樣好,並且可以確保相同的URL始終獲得相同的密鑰,從而防止重複。]

不要忘記,一旦你點擊一個預定義的號碼(或者經常碰撞),就會開始生成更長的ID,因爲當你用完ID並且發生大量衝突時,你不想讓事情變得緩慢。

如果你需要關於碰撞概率和所有這些東西的很好的理論保證,這裏有很多,取決於你使用的哈希方案。

哦,只是在一個側面說明中,確實存在一些使用順序ID的URL縮寫,如http://lilurl.sourceforge.net/。我認爲,它通常是可以避免的主要原因是爲了防止人們時機感好進攻ID,以自己選擇的網址,聯繫起來......

+0

是的,我認爲這樣做的重繪方式會沒事,直到有人指出與大量的條目進行比較的問題。 – 2011-04-28 03:25:38

1

使用常見散列函數之一(如MD5或SHA-1)獲取URL的散列值,將其打印爲十六進制格式,並取最後8個字符(或前8個字符)。這具有可以隨時確定URL是否已被提交的優點。

+0

這是我遇到的第一個解決方案之一,但問題是,沒有任何方法可以確保我選擇的8個字符是唯一的,只有完整的散列纔是唯一的。 – 2011-04-28 03:20:06

+0

你甚至不能保證完整的哈希將是唯一的,但對於所有的實際目的來說,它足夠接近。如果前8個字符的實際用途不夠密切(我認爲它是很多其他軟件使用它作爲完整散列的便捷唯一縮寫),那麼您想要提供確定性的方式來將哈希修改爲後備(可能需要從完整哈希中取8個字符的不同窗口)。 – 2011-04-28 03:28:44

+0

是的,我猜你是對的。最後,我想我想保證安全,並確保沒有任何碰撞。感謝您的洞察力。 – 2011-04-28 04:05:34