2011-09-22 49 views
10

我最近在查看一個保存了一些神祕值的配置文件。我碰巧有可用的源代碼,所以我看了一下它在做什麼,它保存了一堆不同的值,並將它們相互轉換。它讓我困惑爲什麼有人會這麼做。那麼我的問題是:以這種方式存儲數字數據是否有明顯的優勢?我可以看到它是如何以稍小的值存儲的,按字節順序存儲,但似乎有很多工作要保存幾個字節的存儲空間。它似乎也會顯着變慢。爲什麼位移?

我發生的另一種可能性是用於混淆目的。這是位移的常見用法嗎?

+2

通過位移造成的混淆可能是有史以來效率最低的方法之一 – KevinDTimm

+0

@KevinDTimm我曾經看到過一個配置文件,它是通過將每個其他字符放入單獨的緩衝區,然後將兩者結合而生成的。所以文件'configParam = true'變成'cnfgaa reofiPrm = tr'。現在只有一個參數,它可能看起來很混亂,不能馬上解決。對於整個文件來說,這種模式非常明顯。唯一的事情,它不只是一個配置文件,它是一個許可證文件...嗯...我猜只是讓它成爲純文本,並強制執行散列簽名對他們來說太複雜了...... – corsiKa

回答

5

位移位在系統級的語言,如C,C++和彙編似乎更常見,但我在C#在這裏看到它,有太多。它不經常用的這麼多,以節省空間,不過,因爲它是兩個典型的原因之一(或兩者):

  • 你說的是對現有系統(或者用規定的協議,或生成以一種已知的格式存檔),它需要非常精確的佈局;和/或
  • 位的組合包括本身對測試有用的值。

任何人誰使用它在一個高級語言以節省空間或混淆他們的代碼幾乎總是過早優化(和/或白癡)。節省空間很難證明增加的複雜性,並且位移確實不足以阻止某個確定瞭解您的代碼的人。

+0

在我看來,這是答案:在配置文件中似乎沒有增加複雜性的理由。雖然聽到有關位移的實際用途,但這很好。 –

+0

您可能需要它在ASP.net中的會話狀態中的一個'int'eger字段中存儲例如兩個'short's,而無需讀取和鎖定Session讀取兩個獨立值的開銷。同時保存會話中存儲兩個值的開銷。 –

+2

@David:這是......它不應該被使用的最好例子。至少直到你已經完成配置並發現你的應用完全太慢,因爲你正在讀取兩個會話參數而不是一個會話參數。 (PROTIP:除非你是微軟,否則很有可能***並非如此。遠,*遠*更可能是你的算法很糟糕。) – cHao

11

這是位移的常見用法之一。有幾個好處:

1)位移操作很快。

2)您可以將多個標誌存儲在單個值中。

如果您具有幾個特點的應用程序,但你只需要啓用某些(配置)的,你可以這樣做:

[Flags] 
public enum Features 
{ 
    Profile = 1, 
    Messaging = 1 << 1, 
    Signing = 1 << 2, 
    Advanced = 1 << 3 
} 

和你的單值,以使信息和高級是:

(1 << 1) + (1 << 3) = 2 + 16 = 18 

<add name="EnabledFeatures" value="18" /> 

然後找出是否啓用給定的功能,您只需執行一些簡單的按位數學:

var AdvancedEnabled = 
    EnabledFeatures & Features.Advanced == Features.Advanced; 
+1

我不能想象一下,當從文件中收集少量值時,速度會明顯更快......而這種應用程序中的空間節省似乎微不足道。也許開發者只是帶着他/她熟悉的東西去了。 –

+0

你也可以對值(通常是一個狀態變量)進行奇怪的和/或/異或邏輯來找出「合併​​」狀態。真的很奇怪,但我在3D應用程序中看到它在渲染內核,這只是實際解決方案,以保持邏輯的複雜性並且不會在性能上付出代價。 – Tigran

+1

與一個具有1,2,4,8,16等值的枚舉有什麼區別?這會得到什麼? –

4

我有一個項目可以在一週內存儲日/小時可用小時矩陣。所以它有24x7值必須以某種方式存儲。

我選擇將它存儲爲7個整數,所以每一天都用一個整數表示,並且每個小時都以一位表示。只是一個有用的例子。

enter image description here

+0

增加的好處:'if(available_hours [0]!= 0)'表示您是否在星期天(或星期一,如果您進入的話)可用。 – cHao

+0

是的,確切地說...還有簡單的AND和OR操作,可以立即計算各種重疊。 –

+0

有用,信息豐富。我可以看到很多地方我可以使用它。但是,它的使用方式(在配置文件中)看起來並不合理。 –

1

有時(特別是在較舊的Windows編程中),會有信息以值的「高位」和「低位」位編碼......有時需要轉移以獲取信息。我不能100%確定背後的原因,除此之外可能會方便返回一個64位值和兩個32位值編碼的值(所以您可以使用方法中的單個返回值來處理它呼叫)。

我同意你關於不必要的複雜性的斷言,不過我並沒有看到很多應用程序在非常繁重的數字運算/密碼學的東西之外,這將是必需的

相關問題