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

Algorithmes et structures de données Discussion :

à chaque string un unique entier


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier

    Inscrit en
    Avril 2004
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 78
    Points : 74
    Points
    74
    Par défaut à chaque string un unique entier
    Bonjour!

    Alors voilà, je suis en train chercher un algo intelligent pour coder une chaine de caratere en un unique entier, de telle sorte que deux string differentes n'est jamais le meme code.

    Par exemple "ab" ne doit pas avoir le meme code que "ba".

    J'avais eu l'idée de coder de la sorte:
    "abc..." = (code_ascii a)*2^0 + (code_ascii b)*2^1 + (code_ascii c)*2^2 + ....

    mais le pb est que des que la chaine est trop grande, ca dépasse la capacité d'un entier, qui est limité à 31bits (en ocaml)
    Existe t il un autre moyen d'associer un unique entier (pas trop grd) à une chaine?

    merci d'avance!

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    346
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 346
    Points : 439
    Points
    439
    Par défaut
    Il faut que tu trouves une fonction injective de l'ensemble des chaînes dans l'ensemble des entiers.
    - La fonction que tu proposes n'est pas une injection en effet la chaîne formée des caractères ascii "\10\10" a pour valeur 10+100 soit 110 et la chaîne réduite à "\110" a aussi comme valeur 110.
    - Une fonction injective si on limite à de l'ascii sur 7bits serait x0*128^0 + x1*128^1 + x2*128^2 mais cette fonction va rapidement retournée des valeurs supérieures à 2^31
    - Je ne sais pas s'il existe une fonction simple injective qui permettrait cette transformation.
    - As-tu besoin d'une fonction injective ? Ton problème ressemble au choix d'une fonction de hachage idéale.
    Quelques liens sur les tables de hachage :
    http://ciips.ee.uwa.edu.au/~morris/Y...sh_tables.html avec une applet java pour bien comprendre.
    http://fr.wikipedia.org/wiki/Table_de_hachage
    http://en.wikipedia.org/wiki/Hash_table

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    2^31 = 2 147 483 648
    Si tu limites ton alphabet à 27 lettres (+ espace), donc sans prendre en compte les majuscules, les accents, la ponctuation...
    27^6 = 387 420 489
    27^7 = 10 460 353 203
    Tu devras donc te contenter de chaînes de longueur 6.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut Re: à chaque string un unique entier
    Citation Envoyé par Mr_Chut
    Bonjour!

    Alors voilà, je suis en train chercher un algo intelligent pour coder une chaine de caratere en un unique entier, de telle sorte que deux string differentes n'est jamais le meme code.

    Par exemple "ab" ne doit pas avoir le meme code que "ba".

    J'avais eu l'idée de coder de la sorte:
    "abc..." = (code_ascii a)*2^0 + (code_ascii b)*2^1 + (code_ascii c)*2^2 + ....

    mais le pb est que des que la chaine est trop grande, ca dépasse la capacité d'un entier, qui est limité à 31bits (en ocaml)
    Existe t il un autre moyen d'associer un unique entier (pas trop grd) à une chaine?

    merci d'avance!
    Tu as le module Int64 sous ocaml qui te fournis des entier sur 64 bits mais ca ne fait que repousser un peu le problème.

    As-tu absolumeent besoin d'un entier ? Un empreinte SHA1 par exemple ne pourrait pas convenir ?

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 149
    Points : 28 116
    Points
    28 116
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     2^63 : 9 223 372 036 854 775 808
     
    27^13 : 4 052 555 153 018 976 267
    Avec int64, tu peux donc te limiter à 13 caractères au lieu de 6.
    Sinon, tu vas devoir toi-même coder un type grand entier, ce qui n'est pas si complexe que ca (attention au problème de "little endian" ou "big endian" en fonction de ce que tu souhaites faire comme triatement sur ces nombres).
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Salut,

    Il existe des choses toutes faites pour ton problème, elles s'appellent des fonctions de hash. En fait elle ne garantissent pas l'unicité du résultat, mais la probabilité que deux chaines est le même hash est tellement faible que ce n'est jamais un problème. Il existe probablement des bibliothèques OCAML pour les hash les plus populaires : MD5, SHA-1, SHA-256, TIGER, ...

  7. #7
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par nicolas581
    Il faut que tu trouves une fonction injective de l'ensemble des chaînes dans l'ensemble des entiers.
    - La fonction que tu proposes n'est pas une injection [...]]
    Si tu ne te limites pas au niveau de la longueur de la chaîne ou de l'alphabet utilisé c'est impossible de trouver une injection. En effet, il faudrait qu'il y ait moins de chaines que de nombres. Or 2^31 n'est pas si grand que ça et du coup ça limite énormément les possibilités pour les chaînes de caractères. Par conséquent il existera forcément deux chaînes qui auront le même nombre. Comme je l'ai lu dans d'autres messages, utiliser un algo comme MD5 ou SHA1 peut être une bonne solution. Je pense qu'on doit pouvoir trouver des infos à ce sujet sur le net. A toi de jouer
    Windows XP - Delphi 7
    Nous ne controlons une chose que si nous sommes capables de la détruire à tout moment. [Frank Herbert - Dune]

Discussions similaires

  1. Tester si mon string est un entier
    Par womannosky dans le forum Langage
    Réponses: 7
    Dernier message: 06/11/2008, 12h36
  2. Réponses: 6
    Dernier message: 15/04/2008, 00h38
  3. [DOM XML] Obtenir le contenu de chaque noeud fils1 uniquement
    Par arnoweb dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 15/11/2006, 14h43
  4. [debutant] Concatenation d'une chaine (string) et d'entiers
    Par websurfeur dans le forum Débuter
    Réponses: 2
    Dernier message: 26/03/2006, 11h05
  5. [String] Conversion vers entier
    Par Javatator dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 19/08/2004, 15h59

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