2010-03-31 143 views
1

我正在根據原始文件名及其版本的摘要存儲幾個版本的文件,如下所示:緩存SHA1摘要結果?

$ filename = sha1($ original。':'。$ version);

將memcache中的摘要($ filename)緩存爲鍵/值對(關鍵字是原始+版本並賦值sha1哈希值),還是快速生成摘要(對於高流量的PHP網絡應用程序)?

謝謝,

喬納森

+1

散列算法被設計爲快速(以及安全)。我的猜測是,如果你的網絡應用程序的性能受計算散列速度的限制,你的狀態會非常好。現在,如果您按照每個請求計算數百個這樣的數據,那麼情況就不一樣了...... – 2010-03-31 03:18:23

+0

我還要指出,如果您使用任何類型的TLS/SSL連接到您的Web應用程序,並且Web服務器已經做大量散列,可能使用SHA1,並且輸入的文件比文件名要長得多。 – 2010-03-31 17:39:18

回答

2

你」沒有緩存哈希好得多。在我的筆記本上計算短文件名100000個哈希大約需要1/2秒(一個相當快的Core 2 Duo):

 byte[][] fileNames = Enumerable.Range(0, 100).Select(i => new UnicodeEncoding().GetBytes(System.IO.Path.GetRandomFileName())).ToArray(); 
     Stopwatch stopWatch = new Stopwatch(); 

     using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider()) 
     { 
      stopWatch.Start(); 
      for (int j = 0; j < 1000; j++) 
      { 
       for (int i = 0; i < 100; i++) 
       { 
        sha1.ComputeHash(fileNames[i]); 
       } 
      } 
      stopWatch.Stop(); 
      Console.WriteLine("Total: {0}", stopWatch.Elapsed); 
      Console.WriteLine("Time per hash: {0}", new TimeSpan(stopWatch.ElapsedTicks/100000)); 
     } 

總計:00:00:00:00:每個哈希00.5186110 時間00.0000014

+0

海報使用PHP,而不是C# – 2010-04-01 14:10:53

0

哈希是極其快,特別是對於小輸入(例如名稱和文件的版本)。現在

,如果你是散列文件本身,他們是非常大的,這將是一個不同的故事(僅僅是因爲它會需要很長時間來讀取從磁盤整個文件)