最近在做一個網站定時產生頁面的功能,其中出現了一個問題是產生頁檔案名稱重名的問題。剛開始,我通過時間來命名,就是說什麼時間產生,它的名字就是那一刻的時間,而且精確到了毫秒級,通常這樣做已經足夠了,不會出現差錯,但是很不幸,我發現頁面產生的效率要遠比我想象的要高,我測試了一下,20個頁面竟然可以在一毫秒內產生,這樣就導致了後來的頁面覆蓋掉前面的,最後只剩下最後一個頁面而已了。
有一種解決辦法就是判斷重名,如果檔案名稱已經存在,那麼就換一個名字,但是,這樣每次都要判斷。更要緊的是,隨著時間的推移,現有的頁面必然越來越多,每次產生都要遍曆一下目錄,豈不是很麻煩?雖然可能有比較好的搜尋演算法來提高效率,但是我想還不如從根本上解決這個問題更好。
這樣就是產生了使用GUID的想法,GUID的全拼是globally unique identifier,即全球唯一識別碼。GUID是微軟使用的一個術語,通過特定的演算法,給某一個實體建立一個唯一的標識,此標識符可以保證全球唯一。
一個 GUID 共128位長(16位元組),形如 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。其中每個 x 是 0-9 或 a-f 範圍內的一個十六進位的數字,前4個位元組為隨機數;5-8位元組為時間戳記,記錄了該GUID的產生時間(低16位字在前,以分鐘為單位),保證了時間上的唯一;9-10位元組與機器重啟次數有關;最後6位元組一般為該機器的網卡地址(如果這台機器沒有網卡,則使用另一常數),從而保證了空間上的唯一。因此幾乎不可能產生兩個相同的GUID,從而保證了名字的唯一性。
GUID 在 .NET 中的使用很廣泛,同時.NET Framework 提供了專門 Guid 類,使用者可以很容易的產生GUID。比如在asp.net中就可以想這樣產生一個GUID:System.GUID.NewGUID()。基於這樣的原理,我就可以使用這個類為我產生的檔案命名了,從根本上解決了重名的問題。不僅如此,這個方法還可以應用到上傳檔案的命名上。
進一步瞭解,發現GUID使用很廣泛,其實我們平時也經常看到。如註冊表、類及介面標識、資料庫、以及自動產生的機器名、目錄名等。你可以開啟你的系統硬碟下\WINDOWS\Installer目錄,可以看到很多類似{0EFDF2F9-836D-4EB7-A32D-038BD3F1FB2A}的檔案夾,這就是系統自動產生的目錄名。註冊表中也可以發現這樣的數字串,以前也不知道是什麼,現在明白了,都是系統為了避免重名產生的GUID。
更多詳細參考:http://blog.mm-share.cn/post/139.html
貓貓的園地