IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Framework .NET Discussion :

Recherche compatibilité pour string.GetHashCode() du .NET 2.0


Sujet :

Framework .NET

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2011
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Recherche compatibilité pour string.GetHashCode() du .NET 2.0
    Bonjour,

    Je développe un programme en .NET 4.6 qui doit, pour certaines raisons, se synchroniser avec un autre programme existant tournant sous Windows 32 bits et développé avec .NET 2.0.

    Le problème est que le programme existant utilise string.GetHashCode() pour générer des seeds utilisées pour le random. C'est une erreur absolue du développeur mais je suis obligé de faire avec...

    Je dois, dans le nouveau programme en .NET 4.6, générer les mêmes seeds que l'autre programme, à partir des mêmes strings (qui elles sont générées à partir de la date).

    Évidemment, en .NET 4.6 les hash codes ne sont plus générés de la même façon. Je cherche donc, à défaut d'une meilleure solution, à réimplémenter la méthode string.GetHashCode() du .NET 2.0 dans mon programme afin de pouvoir obtenir les mêmes résultats.

    J'ai trouvé plusieurs implémentations de cette méthode mais toujours pour des versions plus récentes de .Net que la 2.0.

    Je commence à perdre espoir mais je demande de l'aide, au cas où... Un grand merci à ceux qui ont pris la peine de me lire.

  2. #2
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Hello, la réponse est sûrement bien tardive !! mais, le code semble être celui là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
        class Program {        
             static void Main(string[] args) {
                var rnd = new Random();
                for (int i = 0; i < 1000; i++) {
                    var str = RandomString(rnd.Next(10, 100));
                    var hashOrig = str.GetHashCode();
                    var hashNew = GetHashCode(str);
     
     
                    if (hashOrig != hashNew) {
                        Console.WriteLine("Erreur");
                        System.Diagnostics.Debugger.Break();
                    }
                }
            }
     
     
            public static string RandomString(int size) {
                var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
                var stringChars = new char[size];
                var random = new Random();
     
     
                for (int i = 0; i < stringChars.Length; i++) {
                    stringChars[i] = chars[random.Next(chars.Length)];
                }
     
     
                return new String(stringChars);
            }
     
     
            public static unsafe int GetHashCode(string str) {
                if (IntPtr.Size == 4) { // x86
                    fixed (char* chPtr = str) {
                        int num1 = 352654597;
                        int num2 = num1;
                        int* numPtr = (int*)chPtr;
                        for (int length = str.Length; length > 0; length -= 4) {
                            num1 = (num1 << 5) + num1 + (num1 >> 27) ^ *numPtr;
                            if (length > 2) {
                                num2 = (num2 << 5) + num2 + (num2 >> 27) ^ numPtr[1];
                                numPtr += 2;
                            } else
                                break;
                        }
                        return num1 + num2 * 1566083941;
                    }
                } else { // x64
                    fixed (char* chPtr1 = str) {
                        int num1 = 5381;
                        int num2 = num1;
                        int num3;
                        for (char* chPtr2 = chPtr1; (num3 = (int)*chPtr2) != 0; chPtr2 += 2) {
                            num1 = (num1 << 5) + num1 ^ num3;
                            int num4 = (int)chPtr2[1];
                            if (num4 != 0)
                                num2 = (num2 << 5) + num2 ^ num4;
                            else
                                break;
                        }
                        return num1 + num2 * 1566083941;
                    }
                }
            }
        }
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 111
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 111
    Points : 1 616
    Points
    1 616
    Par défaut
    La note de la doc n'est pas forcément très rassurante https://learn.microsoft.com/fr-fr/do...tframework-4.6
    La stabilité du code de hachage lui-même n’est pas garantie. Les codes de hachage pour les chaînes identiques peuvent différer entre les implémentations de .NET, entre les versions .NET et entre les plateformes .NET (par exemple, 32 bits et 64 bits) pour une version unique de .NET. Dans certains cas, ils peuvent même varier par domaine d’application. Cela implique que deux exécutions ultérieures du même programme peuvent retourner des codes de hachage différents.

Discussions similaires

  1. compatibilité XP vista pour un code vb.net help
    Par guillaumeIA dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/09/2009, 11h16
  2. [String]Recherche algo pour calcul dimension
    Par GyZmoO dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 30/04/2008, 12h12
  3. Recherche ibrairie pour éxécuter des requêtes SQL via C++
    Par daemon dans le forum Choisir un environnement de développement
    Réponses: 5
    Dernier message: 14/06/2004, 10h28
  4. [Choix de langage] recherche language pour projet precis
    Par Boudiou dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 29/05/2004, 20h00
  5. Recherche d'un String dans un String ?
    Par apen2k2 dans le forum Langage
    Réponses: 9
    Dernier message: 14/04/2003, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo