|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() |
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. |
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Inscription : mars 2005 Messages : 577 ![]() |
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:
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 :
|
||
|
|
10
|
|
|
#3 | |
|
Membre du Club
![]() |
Merci pour ta réponse kain_tn, le résultat que je doit obtenir doit répondre à ces deux éléments :
Citation:
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 ? |
|
|
|
00
|
|
|
#4 | |||
|
Membre Expert
![]() Inscription : mars 2005 Messages : 577 ![]() |
Citation:
__________________
Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros! Code C :
|
|||
|
|
00
|
|
|
#5 | ||
|
Membre du Club
![]() |
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 :
D’ailleurs lorsque l'on essaye Code :
conv('5B7BBBA10069576E1E31A0', 16, 10), Mon problème ne se résout pas. |
||
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() Inscription : mars 2005 Messages : 577 ![]() |
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 :
|
||
|
|
00
|
|
|
#7 |
|
Membre du Club
![]() |
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); Code :
SELECT conv(HEX(ENCODE('TestChaaaaaaaine', "MySalt")), 16, 10); Code :
SELECT conv('5B7BBBA10069576E1E31A0', 16, 10); Une solution pour ce problème ? |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com