2014-05-12 195 views
1

我一直在玩不同的System.Security.Cryptography散列函數來了解不同哈希系統的密鑰長度。爲此,我考慮編寫一個基於參數返回密鑰大小的方法。 (返回鍵大小都沒有問題,那就是讓我問的問題)傳遞沒有構造函數作爲參數的類型

不過,我覺得這一點:

// I know I could use the interface as the type of T but let's define it as dynamic for now 
public static Byte[] Size(dynamic T) { 

    return T.Create().ComputeHash(Encoding.Default.GetBytes("hello")); 
} 
現在

,因爲這些散列函數(哈希生成類型)沒有構造,我不能用這個方法就像

Size(new MD5()); // This is wrong coz there is no constructor 

,我無法通過類型就像:

Size(MD5); // Error 

如果我想直接將這些類型作爲參數傳遞,而不先聲明它們並將它們傳遞給MD5 md5Size(md5),那我到底需要做什麼。 我只是好奇,如果這是可能的。

+0

這個網站幫了我接着就,隨即。 http://www.dijksterhuis.org/creating-salted-hash-values-in-c/ – KamRon

回答

2

您可以反射的幫助下做

var size = Size<MD5>(); 

public static Byte[] Size<T>() 
{ 
    dynamic hashFxn = typeof(T).InvokeMember("Create",BindingFlags.Static| BindingFlags.Public | BindingFlags.InvokeMethod,null,null,null); 
    return hashFxn.ComputeHash(Encoding.Default.GetBytes("hello")); 
} 
+0

傑出的,是的,這正是我的意思。今天借了一些東西,謝謝,會接受這個答案。 – JAX

0

您不能直接創建MD5類的實例,因爲它被標記爲抽象。相反,您應該創建繼承MD5的類的實例。

有兩個選項,MD5CngMD5CryptoServiceProvider,在System.Security.Cryptography之內。

現在,您可以通過Size(new MD5CryptoServiceProvider()),但它會在運行時失敗,因爲沒有通過MD5MD5CryptoServiceProvider公開的實例Create方法。

修改你的方法採取HashAlgorithm,而不是dynamic,並刪除Create方法調用:

public static Byte[] Size(HashAlgorithm T) { 

    return T.ComputeHash(Encoding.Default.GetBytes("hello")); 
} 
0

MD5是一個抽象類,所以你需要提供一個具體子類。你可以這樣做:

public static byte[] Size<T>() where T : HashAlgorithm, new() 
{ 
    using (var hash = new T()) 
    { 
     return hash.ComputeHash(Encoding.Default.GetBytes("hello")); 
    } 
} 

,並用它喜歡:

var bytes = Size<MD5CryptoServiceProvider>(); 
相關問題