2009-07-31 7 views
1

Je tire 500 résultats d'une requête de recherche vers un webservice; Je stocke ces dans la session pour cet utilisateur si la pagnation ne provoque pas d'autres appels. Ce que je veux faire est de coller les paramètres ensemble dans une longue chaîne et les hacher ainsi j'ai un hachage rapide pour vérifier.Comment stocker un hachage avec les résultats de la recherche?

en php cela ressemblerait à quelque chose comme ...

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

Terminé paresseusement de toute façon.

Donc, en C# Je ...

#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 

Et apparemment aucun défaut classe MD5 construit donc je l'ai utilisé un autre site hors.

#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 

Ce qui ne fonctionne pas correctement. rarRef est dans l'original (public ActionResult Index (chaîne rarREF)) Y at-il un moyen plus rapide, car cela doit être rapide. Est-ce que Base64 l'encoderait?

+0

votre code php n'a pas apparaître ... – Jason

+1

De quelle façon il fonctionne pas « correctement » – djna

+0

@djna: Zut - jus accidentellement battant pavillon votre commentaire au lieu de upvoting il en raison de la navigation mobile et des gros doigts. Pardon! –

Répondre

1

Pourquoi ne pas simplement utiliser une table de hachage? La clé serait vos paramètres de requête concaténés (avec un séparateur approprié) la valeur serait votre objet de résultat. Permettre à la classe Hashtable pour traiter et hash collisions

+1

C'est en fait une très bonne idée ... Je vais enculer et regarder HashTables maintenant: o) –

2

C'est une manière assez inefficace de faire la conversion - ainsi que de la longue durée. Il y a certainement des façons plus simples de le faire.

Voici une routine beaucoup plus simple pour obtenir un hachage MD5 pour une chaîne, convertie en une chaîne trop:

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

Cela dit, la routine originale (maintenant que je l'ai regardé plus attentivement) semble avoir fonctionné correctement. Je recommande d'utiliser ce qui précède de toute façon, car c'est plus simple, mais ...

Si cela ne fonctionne toujours pas correctement, pourriez-vous expliquer exactement ce que vous observez? Que se passe-t-il ?

+0

Je serais enclin à disposer de l'instance MD5 créée étant donné qu'elle implémente IDisposable si ... –

+0

Eek, n'avait pas repéré cela. * Se bloque la tête dans la honte. * Éditera. –

+0

mais pourquoi le faisons-nous? On dirait que nous essayons de construire un HashTable - nous avons des bibliothèques pour cela. – djna

Questions connexes