如何使用搜索结果存储哈希值?

时间:2009-07-31 15:58:57

标签: c# asp.net asp.net-mvc .net-3.5

我将搜索查询的500个结果提取到网络服务;我将这些存储在该用户的会话中,因此pagnation不会导致进一步的调用。

我想要做的是将参数组合成一个长字符串并对其进行哈希处理,以便我有一个快速哈希来检查。

在php中,这看起来像......

<?php
$_SESSION["shash"] = md5($_GET['x'] . $_GET['y'] . $_GET['z']);
?>
无论如何,

完成懒惰。

所以在C#中我有......

    #region Session Check
        string sCheckStr = rarREF;
        string searchCheck = GetMd5Sum(sCheckStr);
        if ((Session["schk"].ToString().Length > 0) && (Session["schk"].ToString() == searchCheck))
        { }
        else
        {
            if (searchResults != null) this.mySess.SessionVariables.SearchResults = null;
            Session["schk"] = searchCheck;
        }
    #endregion

显然没有内置的默认MD5类,因此我使用了另一个网站。

  #region MD5 Class
    static public string GetMd5Sum(string str)
    {
        // First we need to convert the string into bytes, which
        // means using a text encoder.
        Encoder enc = System.Text.Encoding.Unicode.GetEncoder();

        // Create a buffer large enough to hold the string
        byte[] unicodeText = new byte[str.Length * 2];
        enc.GetBytes(str.ToCharArray(), 0, str.Length, unicodeText, 0, true);

        // Now that we have a byte array we can ask the CSP to hash it
        MD5 md5 = new MD5CryptoServiceProvider();
        byte[] result = md5.ComputeHash(unicodeText);

        // Build the final string by converting each byte
        // into hex and appending it to a StringBuilder
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < result.Length; i++)
        {
            sb.Append(result[i].ToString("X2"));
        }

        // And return it
        return sb.ToString();
    }
    #endregion

哪个不能正常工作。 rarRef是原始的(公共ActionResult索引(字符串rarREF)) 有更快的方法,因为这需要快速。它会对Base64进行编码吗?

2 个答案:

答案 0 :(得分:2)

这是一种非常低效的转换方式 - 以及长途跋涉。当然有更简单的方法。

这是一个更简单的例程来获取字符串的MD5哈希值,也转换回字符串:

public static string Md5HashString(string input)
{
    byte[] bytes = Encoding.UTF8.GetBytes(input);
    byte[] hash;
    using (MD5 md5 = MD5.Create())
    {
        hash = md5.ComputeHash(bytes);
    )
    return Convert.ToBase64String(hash);
}

话虽如此,原来的例程(现在我已经仔细研究过了)看起来应该没问题。我建议使用上面的,因为它更简单,但是......

如果仍然无法正常使用,您能准确解释一下您观察到的内容吗? 发生了什么?

答案 1 :(得分:1)

为什么不使用哈希表?

密钥将是您的串联查询参数(使用合适的分隔符),该值将是您的结果对象。允许HashTable类处理散列和冲突