如何在C#中使用SqlFunctions.Checksum生成哈希字符串

时间:2018-12-18 08:57:39

标签: c# asp.net sql-server

我正在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执行此操作 功能。

任何想法??

1 个答案:

答案 0 :(得分:0)

调用.ForEach()方法会出现此错误。这是Linq-To-Object的一种方法。但是SqlFunctionsLinq-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函数。