Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/08/2011, 14h12   #1
Membre du Club
 
Avatar de Wiink
 
Inscription : septembre 2010
Messages : 63
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 63
Points : 48
Points : 48
Envoyer un message via MSN à Wiink Envoyer un message via Skype™ à Wiink
Par défaut Convertir une chaine binaire en INT

Bonjour à tous,

Voici mon problème, j'ai besoin d'encoder une chaine, et en sortir un résultat sous forme de chiffres.
Exemple, je cherche à encoder : 'TestChaine'
J'utilise la fonction encode de cette façon :

ENCODE('TestChaine', "MySalt")Le résultat est une chaine binaire.
Je souhaite en faire un chiffre.

Piste de réflexion que j'ai eue :
Une des rares méthodes que j'ai trouvée est d'utiliser HEX, puis passer le résultat de base 16 à 10. (solution un peut tirée par les cheveux ...)
CONVERT(HEX(ENCODE('TestChaine', "MySalt")), DECIMAL)Le souci c'est que HEX ne va ici me retourner qu'une chaine de caractères représentant le nombre, au lieu d'un nombre en base 16.

Il y a surement une solution simple pour cette conversion, merci pour votre aide.
Wiink est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 15h48   #2
Membre Expert
 
Avatar de kain_tn
 
Homme
Inscription : mars 2005
Messages : 577
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2005
Messages : 577
Points : 1 209
Points : 1 209
Bonjour,

En réalité ce qui le résultat de ta fonction encode() est bien une chaîne sauf que tous les caractères ne sont pas forcément affichables.

Pour t'en convaincre essaye SELECT cast(encode('TestChaine', 'MySalt') AS char). Tu verras qu'il s'agit exactement de la même chaîne que pour SELECT encode('TestChaine', 'MySalt').

Maintenant tout dépend de ce que tu veux faire de cette valeur.


Est-ce que tu veux la stocker pour une utilisation ultérieure avec decode() par exemple? Tu peux utiliser une simple colonne char.

Est-ce que tu veux la récupérer pour l'afficher? Dans ce cas tu peux afficher la valeur décimale (ascii) ou hexadécimale de chaque caractère (comme tu l'as fait avec hex()).
Si tu veux vraiment un nombre, là il va falloir récupérer la valeur de chaque caractère et les additionner entre elles... (sous MySQL je ne vois pas comment faire ça sans passer par une procédure stockée)

Une autre possibilité est que tu veux simplement obtenir un nombre à partir de ta chaîne. Les questions que je me pose à ce moment là sont:
  • Est-ce que chaque chaîne doit donner un résultat unique?
  • Est-ce que le résultat obtenu doit être réversible? (c'est à dire que l'on peut retrouver la chaîne d'origine depuis le nombre obtenu)

Si la réponse à ces deux questions est non, alors pourquoi ne pas utiliser une fonction de hashage? Par exemple sha1() est implémenté dansMySQL (mais sha256 te donnerait moins de collisions) et il suffit de faire une conversion de base 16 vers 10 pour avoir ton nombre: SELECT conv(sha1('TestChaine'), 16, 10)
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


Code C :
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(int argc, char **argv) {
 
    printf("So long, and thanks for the fish, Dennis...\n");
    return 0;
}
kain_tn est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/08/2011, 17h09   #3
Membre du Club
 
Avatar de Wiink
 
Inscription : septembre 2010
Messages : 63
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 63
Points : 48
Points : 48
Envoyer un message via MSN à Wiink Envoyer un message via Skype™ à Wiink
Merci pour ta réponse kain_tn, le résultat que je doit obtenir doit répondre à ces deux éléments :

Citation:
Envoyé par kain_tn Voir le message
  • Est-ce que chaque chaîne doit donner un résultat unique?
  • Est-ce que le résultat obtenu doit être réversible? (c'est à dire que l'on peut retrouver la chaîne d'origine depuis le nombre obtenu)
Donc pas de Sha1 possible malheureusement.
J'ai besoin d'afficher un résultat unique en chiffre, qui doit être réversible.
Il m'est possible d'utiliser une procédure stocké, mais même avec ça je ne sait pas vraiment comment atteindre mon objectif.

Avoir un INT en partant d'une chaine Hexa doit bien pouvoir se faire d'une façon où d'une autre ... non ?

Edit : Donc le défis est de passer une chaine Hexa en nombre Hexa. Impossible ?
Wiink est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2011, 12h33   #4
Membre Expert
 
Avatar de kain_tn
 
Homme
Inscription : mars 2005
Messages : 577
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2005
Messages : 577
Points : 1 209
Points : 1 209
Citation:
Envoyé par Wiink Voir le message
Edit : Donc le défis est de passer une chaine Hexa en nombre Hexa. Impossible ?
Pourquoi ne pas considérer ta chaine hexa comme du BCD (ce qu'elle est clairement) puis faire un changement de base de ce "nombre" vers du décimal avec conv(chaine, 16, 10)?
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


Code C :
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(int argc, char **argv) {
 
    printf("So long, and thanks for the fish, Dennis...\n");
    return 0;
}
kain_tn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2011, 17h08   #5
Membre du Club
 
Avatar de Wiink
 
Inscription : septembre 2010
Messages : 63
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 63
Points : 48
Points : 48
Envoyer un message via MSN à Wiink Envoyer un message via Skype™ à Wiink
Merci pour cette info kain.
On dirait qu'il y a une limite à l'utilisation de la fonction CONV, sur de petites valeur ça fonctionne, mais sur l'exemple ci-dessous, les résultat ne sont pas cohérent :


Code :
1
2
conv(HEX(ENCODE('TestChaine', "MySalt")), 16, 10) #result : 18446744073709551615
conv(HEX(ENCODE('XXXX', "MySalt")), 16, 10) #result : 18446744073709551615
2 résultats similaires alors que la chaine d'entrée est différente.

D’ailleurs lorsque l'on essaye
Code :
conv('5B7BBBA10069576E1E31A0', 16, 10),
Le résultat est FFFFFFFFFFFFFFFF.

Mon problème ne se résout pas.
Wiink est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2011, 20h20   #6
Membre Expert
 
Avatar de kain_tn
 
Homme
Inscription : mars 2005
Messages : 577
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2005
Messages : 577
Points : 1 209
Points : 1 209
Bizarre, quand j'essaye SELECT conv('5B7BBBA10069576E1E31A0', 16, 10);, j'obtiens 18446744073709551615

Et ce n'est pas tout. Chez moi:

SELECT conv(HEX(ENCODE('TestChaine', "MySalt")), 16, 10); me retourne 18446744073709551615

SELECT conv(HEX(ENCODE('XXXX', "MySalt")), 16, 10); me retourne 2059766858
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


Code C :
1
2
3
4
5
6
7
#include <stdio.h>
 
int main(int argc, char **argv) {
 
    printf("So long, and thanks for the fish, Dennis...\n");
    return 0;
}
kain_tn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 12h59   #7
Membre du Club
 
Avatar de Wiink
 
Inscription : septembre 2010
Messages : 63
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 63
Points : 48
Points : 48
Envoyer un message via MSN à Wiink Envoyer un message via Skype™ à Wiink
Après une légère absence, me revoilà pour ce problème.

18446744073709551615 est la valeur maximal que peut nous retourner CONV 16,10

Que l'on fasse donc

Code :
SELECT conv(HEX(ENCODE('TestChaine', "MySalt")), 16, 10);
ou
Code :
SELECT conv(HEX(ENCODE('TestChaaaaaaaine', "MySalt")), 16, 10);
ou
Code :
SELECT conv('5B7BBBA10069576E1E31A0', 16, 10);
Le résultat est toujours 18446744073709551615 ...

Une solution pour ce problème ?
Wiink est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h54.


 
 
 
 
Partenaires

Hébergement Web