HashCode avec lettres accentuées...

HashCode avec lettres accentuées... - C++ - Programmation

Marsh Posté le 07-04-2005 à 12:04:03    

Bonjour,  
j'ai la fonction suivante qui me permet de calculer un code en fonction d'une chaîne de caractères.
 

Code :
  1. int HashCode(string chaine)
  2. {
  3.     int ret=0;     // valeur retournée
  4.     int p=0;        // parcours de la chaine en entree
  5.     cout << chaine << " : " << (unsigned int)chaine[p] << endl; //////////////
  6.     while(chaine[p] != '\0')
  7.     {
  8.         ret = ret*256 + (unsigned int) chaine[p];
  9.         if (ret >= TAILLE_MAX_TAB)
  10.             ret = ret%TAILLE_MAX_TAB;
  11.         p++;
  12.     }
  13.     cout << ret << endl; ///////////
  14.     return ret;
  15. }


 
Il y a un problème lorsque la chaine passée en paramètre commence par une lettre accentuée (ret prend alors comme valeur -xxxxxxxxx) et j'aimerais résoudre ce problème sans bidouillage (si je met une condition sur les caractères à lire ca fonctionne mais ca rend la fonction de hashcode moins performante!)
Quelqu'un a une idée ?  :bounce:


Message édité par Kineas le 07-04-2005 à 12:04:43
Reply

Marsh Posté le 07-04-2005 à 12:04:03   

Reply

Marsh Posté le 07-04-2005 à 13:12:54    

Aurai-je posé une colle du c++ ?

Reply

Marsh Posté le 07-04-2005 à 17:15:27    

Hello,  
 
Ce n'est pas une erreur.  
Si tu ne veux plus de signe passe ta déclaration de retour de fonction et la variable Ret en unsigned int.  
 
explication :
Le signe - c'est la valeur du premier bit (poids le plus fort) de l'integer signé.
 
exemple (sur un octet) :  
64 =  = 40 hex = 01000000 b (MSB à 0)
-64 = FC hex = 11000000 b (MSB à 1)
 
maintenant si tu fais Ret = 64 + 64 tu obtients ... -1 sur un signé et 128 sur un non signé.
=> 128 = 80 hex = 10000000 b (MSB à 1) => -1
 
C'est vrai sur un octet mais aussi sur un int, long ...
A+


Message édité par m3z le 07-04-2005 à 17:16:06
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed