我正在c#中寻找CHECKSUM MS SQL函数的副本。 当我在IDataReader中获取数据时,我想使用SqlFunctions.Checksum方法将一列从纯字符串转换为哈希字符串。
示例代码:
IDataReader reader = base.DataBase.ExecuteReader(cmd);
var dsList = new List<IHumanReadableData>();
dsList = _humanReadableDataObjectMapper.MapList(reader);
dsList.ForEach(r => {
r.PersonName = SqlFunctions.Checksum(r.PersonName).ToString();
});
此代码段显示错误:“此功能只能从LINQ到Entities调用”。
注意:
我不想使用标准的哈希算法,因为我不想很长时间 要生成的哈希字符串。
我想要一个散列但相对较小的字符串,以便我的用户可以 比较它们,而不用暴露敏感数据(即 PersonName)。
我不想使用CHECKSUM从MS SQL执行此操作 功能。
任何想法??
答案 0 :(得分:0)
调用.ForEach()
方法会出现此错误。这是Linq-To-Object
的一种方法。但是SqlFunctions
是Linq-To-Entities
方法。所以你有这个错误。
您可以做的是创建一个扩展方法,计算T-SQL的CheckSum
之类的哈希值(请参见此处C# implementation of CheckSum())并在您的C#代码中使用它。让我举个例子:
首先,为string
类型创建扩展方法:
public static class Extension
{
public static int Checksum(this string text)
{
if (text == null)
return 0;
long sum = 0;
byte overflow;
for (int i = 0; i < text.Length; i++)
{
sum = (long)((16 * sum) ^ Convert.ToUInt32(text[i]));
overflow = (byte)(sum / 4294967296);
sum = sum - overflow * 4294967296;
sum = sum ^ overflow;
}
if (sum > 2147483647)
sum = sum - 4294967296;
else if (sum >= 32768 && sum <= 65535)
sum = sum - 65536;
else if (sum >= 128 && sum <= 255)
sum = sum - 256;
return (int)sum;
}
}
并在您的方法中使用它:
static void Main(string[] args)
{
List<Person> persons = new List<Person>()
{
new Person(){IdPerson = 1, FirstName = "1" },
new Person(){IdPerson = 2, FirstName = "2" },
new Person(){IdPerson = 3, FirstName = "3" },
new Person(){IdPerson = 4},
};
persons.ForEach(r => {
r.FirstName = r.FirstName.Checksum().ToString();
});
}
更新:
MSDN does not say what algorithm is used in CHECKSUM
function。因此,您必须使用LINQ-to-Entities
才能使用T-SQL
函数。