IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
FAQ Qt FAQ Qt Creator FAQ PyQt & PySide

FAQ Qt

FAQ QtConsultez toutes les FAQ

Nombre d'auteurs : 26, nombre de questions : 298, dernière mise à jour : 15 juin 2021 

 
OuvrirSommaireModulesQt CoreDivers

Pour calculer une somme de contrôle cryptographique (couramment désignée par le terme anglais équivalent : hash), Qt 4.3 et suivants mettent à notre disposition la classe QCryptographicHash. Elle peut hacher n'importe quel QByteArray avec les algorithmes MD4, MD5 et SHA1. Seul le dernier est encore un peu sécurisé, mais c'est le plus lent.

Une collision intervient lorsque deux données ont le même hash. Le temps nécessaire pour détecter une collision détermine la sûreté d'un algorithme de hachage. On peut calculer des collisions pour les deux premiers en moins d'une minute sur un ordinateur moyen, contrairement aux 235 opérations requises pour SHA1 (34 359 738 368 opérations, précisément). Chercher un moyen de trouver des collisions s'appelle la cryptanalyse

Cependant, pour des besoins évolués (système bancaire, authentification sur un site), SHA1 ne convient plus, et doit être remplacé par un algorithme plus performant, comme Whirlpool ou RipeMD-160, pour lesquels on ne connaît pas encore de méthode pour trouver des collisions.

Qt ne supporte pas nativement d'autres algorithmes de hashage. Pour pallier ce manque, la communauté fournit QCA (Qt Cryptographic Architecture). Cette bibliothèque se base sur Qt, et lui fournit moult autres fonctionnalités orientées vers la sécurité.

Quel que soit l'algorithme de hachage utilisé, il est impossible d'éliminer totalement le risque qu'une faille soit découverte, qui mettrait le cassage d'une clé à la portée d'un ordinateur ou un groupe d'ordinateurs aisément disponible. En conséquence, les algorithmes actuels sont étudiés de manière exhaustive et de nouvelles méthodes sont développées continuellement.

On peut utiliser cette classe de manière statique, sans instancier d'objet. Pour cela, on peut utiliser la méthode hash(). Voici son prototype.

 
Sélectionnez
QByteArray QCryptographicHash::hash ( const QByteArray & data, Algorithm method )

Algorithm est une énumération, définie de la manière suivante :

 
Sélectionnez
enum Algorithm { Md4, Md5, Sha1 }
Un exemple d'utilisation statique
Sélectionnez
QByteArray data ("Some data to hash");
QByteArray result ("");

result = QCryptographicHash::hash ( data, QCryptographicHash::Sha1 );

On peut aussi instancier l'objet, si on ne peut pas préciser toutes les données d'un seul coup.

On précise l'algorithme de hashage lors de l'instanciation de l'objet.

Pour ajouter des données à hacher, les méthodes addData() doivent être utilisées. Voici leurs prototypes.

 
Sélectionnez
void QCryptographicHash::addData ( const char * data, int length )
void QCryptographicHash::addData ( const QByteArray & data )

La méthode result() permet de récupérer le hash.

Un exemple d'utilisation dynamique
Sélectionnez
QByteArray data ("Some data to hash");
QByteArray oData ("Other data that will be hashed");
QByteArray result ("");
QCryptographicHash hasher (QCryptographicHash::Sha1);

hash- addData (data) ;
hash->addData ( oData->data(), oData->size() );
result = hash->result();
Mis à jour le 11 mars 2015  par Thibaut Cuvelier

Lien : Qu'est-ce que QCA ?

Il arrive assez fréquemment que l'on nécessite un accès plus significatif au presse-papier du système de fenêtrage que ce dont on a l'habitude avec les fonctions de convenance des diverses classes, comme celles fournies avec les QTextEdit. Pour quoi faire ? Tout simplement effectuer des tâches classiques, comme accéder, modifier ou encore surveiller le presse-papier. Pour effectuer tout cela, Qt a mis au point une classe nommée QClipboard, dont on peut récupérer le pointeur depuis la fonction statique clipboard() de QApplication :

 
Sélectionnez
QClipboard *clipboard = QApplication::clipboard();

La méthode de récupération présentée ci-dessus est l'unique moyen d'obtenir un pointeur de QClipboard. En effet, Qt met à disposition une seule et unique instance de cette classe. De plus, il est notable que, par presse-papier, nous entendons la sélection de la souris, le presse-papier lui-même et le buffer de recherche (fonctionnalité de recherche présente nativement sous Mac OS X).

À partir de cela, nous sommes libres d'exploiter les fonctions mises à disposition par QClipboard comme bon nous semble.

Ci-dessous se situent des exemples simples d'utilisation du presse-papier :

 
Sélectionnez
// Récupération du pointeur de QClipboard :
QClipboard *clipboard = QApplication::clipboard();
 
// Récupération du texte présent dans le presse-papier :
QString text = clipboard->text();
 
// Changement du texte présent dans le presse-papier :
clipboard->setText("http://www.developpez.com/");
 
// Récupération d'une image présente dans le presse-papier :
QImage image = clipboard->image();
 
// Récupération du texte sélectionné par la souris :
QString text2 = clipboard->text(QClipboard::Selection);
Créé le 7 mai 2012  par Louis du Verdier

À cause de l'approximation des nombres réels, tester correctement l'égalité de deux nombres réels peut s'avérer assez complexe.

Pour simplifier cela Qt fournit la fonction qFuzzyCompare qui retourne vrai si deux éléments sont égaux. Cette fonction permet de tester l'égalité sur des float, double, QVector2D , QVector3D , QVector4D , QQuaternion , QMatrix , QMatrix4x4 et QTransform.

Remarques :
  • qFuzzyCompare ne permet pas d'indiquer la précision à appliquer (elle est calculée automatiquement) ;
  • qFuzzyCompare (double p1, double p2) n'est valide que si p1 != 0 et p2 != 0. Une solution pour contourner cette limitation est d'ajouter n à p1 et p2, de telle sorte que p1 + n != 0 et p2 + n != 0.
Créé le 7 mai 2012  par Yan Verdavaine, Pierre-Nicolas Rigal

Lien : Mes calculs sur nombres flottants sont imprécis, que faire ?

Qt utilise la bibliothèque zlib pour compresser les données. Cela veut dire que pouvez compresser et décompresser vos tableau de données en utilisant Qt : Compression d'un QByteArray. Notez que cela ne fait pas de fichier d'archive pouvant être lue par d'autres applications. Pour ce faire, vous devez l'écrire vous-même en utilisant une personnalisation du système de Qt pour la gestion de fichiers.

Ce code simpliste permet de faire la sauvegarde et le chargement de données compressées.

 
Sélectionnez
void myClass::saveData(const QByteArray & ar)
{
  QByteArray compress = qCompress(ar); // compression des données
  m_File.write(compress); // sauvegarde dans le fichier
}
 
void myClass::loadData() 
{
 QByteArray data = qUncompress(m_File.readAll()); //décompresse les données lues dans le fichier
 // les données sont prêtes à être utilisées
}
Créé le 7 mai 2012  par Alexandre Laurent

Lien : Lecture de fichiers LZMA avec QIODevice
Lien : Décompression de fichiers .tar.xz

Qt est extrêmement bien fourni en classes de pointeurs intelligents :

Chacun de ces pointeurs a une signification particulière, un emploi particulier. Avant d'aller plus loin, il faut savoir ce qui distingue les pointeurs intelligents, mais aussi à quoi ils servent.

Un pointeur intelligent permet de garder une référence à un objet, en s'assurant qu'il sera détruit à un certain moment. Ils peuvent être utilisés par plusieurs objets en même temps, pour, par exemple, éviter d'utiliser trop de mémoire.

Principalement, ils peuvent partager des données ou un pointeur sur les données. Un pointeur intelligent peut donc contenir un autre pointeur, ce qui peut s'avérer utile lorsqu'un objet est partagé par plusieurs autres. Ainsi, l'objet référencé n'est stocké qu'une fois en mémoire.

Ensuite, leur référence peut être légère ou forte. La référence forte implique que l'objet n'est pas détruit, cela est garanti par le pointeur intelligent. Tant qu'il existe, l'objet existe. Tandis qu'un pointeur à référence légère (weak pointer) ne peut le garantir : il faut s'assurer qu'il ne sera pas détruit par d'autres moyens.

QPointer est un pointeur intelligent assez lent, de sorte qu'on lui préfère généralement QWeakPointer.

Les pointeurs intelligents peuvent ainsi être classés suivant les quatre catégories suivantes :

Classe Description
QSharedDataPointer & QExplicitelySharedDataPointer Partage de données (implicite et explicite)
QSharedPointer Partage à comptage de référence de pointeurs à référence forte
QWeakPointer Partage à comptage de référence de pointeurs à référence faible
QScopedPointer & QScopedArrayPointer Emballage sans comptage de référence de pointeurs à référence forte
Mis à jour le 7 mai 2012  par Thibaut Cuvelier

Lien : Comment optimiser la copie de ses classes ?
Lien : Qu'est-ce qu'un pointeur intelligent ?
Lien : Les pointeurs intelligents de Qt
Lien : Pointeurs intelligents

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 - 2017 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.