2009-07-31 9 views
1

Ich ziehe 500 Ergebnisse von einer Suchanfrage zu einem Webservice; Ich speichere diese in der Sitzung für diesen Benutzer, so dass die Anrufung keine weiteren Anrufe verursacht.Wie speichere ich einen Hash mit den Suchergebnissen?

Was ich tun möchte, ist die Parameter zusammen in einer langen Zeichenfolge zu kleben und sie zu hacken, so dass ich einen schnellen Hash habe, um gegen zu überprüfen.

in php dies etwas aussehen würde ...

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

Geschehen sowieso Träge.

Also in C# Ich habe ...

#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 

Und anscheinend gebaut keine Standard-MD5-Klasse in so habe ich einen aus einem anderen Standort verwendet.

#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 

Was nicht richtig funktioniert. rarRef ist im Original (öffentlicher ActionResult Index (String rarREF)) Gibt es einen schnelleren Weg, da dieser schnell sein muss. Würde Base64 Encoding es tun?

+0

Ihr PHP-Code nicht angezeigt ... – Jason

+1

In welcher Weise funktioniert es nicht "richtig" – djna

+0

@djna: Darn - jus versehentlich Ihren Kommentar markiert, anstatt es zu upvoting durch mobiles Surfen und dicke Finger. Es tut uns leid! –

Antwort

1

Warum nicht einfach eine Hash-Tabelle verwenden?

Der Schlüssel wären Ihre verketteten Abfrageparameter (mit einem geeigneten Trennzeichen) wäre der Wert Ihr Ergebnisobjekt. Lassen Sie die HashTable-Klasse mit Hashing und Kollisionen umgehen

+1

Das ist eigentlich eine sehr gute Idee ... Ich werde jetzt abstürzen und HashTables betrachten: o) –

2

Das ist ein ziemlich ineffizienter Weg, um die Umwandlung - sowie langwierige. Es gibt sicherlich einfachere Möglichkeiten, dies zu tun.

Hier ist eine viel einfachere Routine eine MD5-Hash für eine Zeichenfolge zu erhalten, auch in einen String umgewandelt zurück:

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

gesagt hat, dass die ursprüngliche Routine (jetzt, dass ich es sorgfältig mehr habe gesucht) sieht aus, als hätte es gut funktionieren sollen. Ich würde empfehlen, die oben genannten sowieso zu verwenden, da es einfacher ist, aber ...

Wenn das immer noch nicht richtig für Sie funktioniert, können Sie genau erklären, was Sie beobachten? Was ist passiert?

+0

Ich würde geneigt sein, die erstellte MD5-Instanz zu entsorgen, da sie IDisposable implementiert, obwohl ... –

+0

Eek, hatte das nicht bemerkt. * Hängt Kopf in Schande. * Wird bearbeitet. –

+0

aber warum machen wir es überhaupt? Klingt so, als würden wir versuchen, eine HashTable zu erstellen - dafür haben wir Bibliotheken. – djna

Verwandte Themen