我一直在使用不同的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 md5
和Size(md5)
那样传递它们,我究竟需要做什么。
如果可能的话,我只是很好奇。
答案 0 :(得分: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"));
}
答案 1 :(得分:0)
您无法直接创建MD5
类的实例,因为它被标记为抽象。相反,您应该创建一个继承MD5
的类的实例。
MD5Cng
内有两个选项,MD5CryptoServiceProvider
或System.Security.Cryptography
。
现在,您可以传递Size(new MD5CryptoServiceProvider())
,但它会在运行时失败,因为Create
或MD5
没有公开实例MD5CryptoServiceProvider
方法。
修改您的方法以取HashAlgorithm
代替dynamic
并删除Create
方法调用:
public static Byte[] Size(HashAlgorithm T) {
return T.ComputeHash(Encoding.Default.GetBytes("hello"));
}
答案 2 :(得分: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>();