2009-07-31 2 views
1

Я вытаскиваю 500 результатов поискового запроса в webservice; Я храню их в сеансе для этого пользователя, поэтому 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 кодировать его?

+0

ваш php-код не появился ... – Jason

+1

Как он не работает «правильно» – djna

+0

@djna: Darn-jus случайно помечен вашим комментарием вместо того, чтобы его перенести из-за мобильного просмотра и толстых пальцев. Сожалею! –

ответ

1

Почему бы не просто использовать хеш-таблицу?

Ключ будет вашим конкатенированным параметром запроса (с подходящим разделителем), это будет ваш объект результата. Разрешить классу HashTable обрабатывать хэширование и коллизии

+1

Это на самом деле очень хорошая идея ... Я буду отвлекаться и посмотреть на HashTables сейчас: o) –

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); 
} 

Сказав, что первоначальная рутину (теперь, когда я смотрел на него более внимательно) похоже, что он должен работать нормально. Я бы рекомендовал использовать выше, так как это проще, но ...

Если это все еще не работает должным образом, не могли бы вы точно объяснить, что вы наблюдаете? Что такое ? happening?

+0

Я был бы склонен избавиться от созданного экземпляра MD5, учитывая, что он реализует IDisposable, хотя ... –

+0

Eek, не заметил этого. * Висит голова в стыде. * Будет редактировать. –

+0

, но почему мы вообще это делаем? Похоже, мы пытаемся создать HashTable - у нас есть библиотеки для этого. – djna

Смежные вопросы