8. Fonctions et code de hachage¶
Les fonctions de hachage sont des outils fondamentaux en informatique qui transforment des données de taille variable en une valeur numérique fixe. Voici une explication détaillée avec des exemples concrets :
Définition et propriétés clés¶
- Transformation unidirectionnelle : Conversion de données arbitraires en empreinte numérique fixe (ex : 32/64 bits)
- Déterministe : Mêmes entrées ➔ même sortie (même après redémarrage)
- Efficacité : Calcul rapide même pour de gros volumes de données
- Résistance aux collisions : Difficulté à trouver deux entrées distinctes avec le même hash (idéalement)
Exemples de fonctions de hachage simples¶
1. Somme ASCII modulo¶
public class SimpleHash {
// Fonction de hachage simple : somme ASCII modulo taille
public static int hashAsciiMod(String key, int tableSize) {
int sum = 0;
for (int i = 0; i < key.length(); i++) {
sum += key.charAt(i); // Ajoute le code ASCII de chaque caractère
}
return sum % tableSize; // Applique le modulo
}
public static void main(String[] args) {
String text = "hello";
int tableSize = 100;
int hashValue = hashAsciiMod(text, tableSize);
System.out.println("Hash de \"" + text + "\": " + hashValue);
}
}
Explications :
1. On parcourt chaque caractère de la chaîne
2. On accumule la somme des codes ASCII (via charAt()
)
3. On applique le modulo avec la taille de la table pour obtenir un index valide
Exemple de sortie :
Amélioration possible :
// Version avec pondération (base 256)
public static int weightedHash(String key, int tableSize) {
int sum = 0;
int n = key.length();
for (int i = 0; i < n; i++) {
sum += key.charAt(i) * Math.pow(256, n-1-i);
}
return sum % tableSize;
}
Cette version pondérée réduit les collisions pour des chaînes avec mêmes caractères mais ordres différents (ex: “abc” vs “cba”).
Citations
- [1] https://python.developpez.com/actu/343966/Apprendre-comment-faire-une-implementation-naive-d-une-table-de-hachage-en-Python-un-billet-blog-de-Denis-Hulo/
- [2] https://fr.wikipedia.org/wiki/Fonction_de_hachage
- [3] https://www.irif.fr/~hf/verif/ens/an11-12/poo/courscomplet.pdf
- [4] http://www.iro.umontreal.ca/~major/IFT1020/notes/Hachage-2pp.pdf
- [5] https://stackoverflow.com/questions/10416550/how-to-implement-hash-function-hk-a-k-mod-2w-w-r-in-java
- [6] https://fr.wikibooks.org/wiki/Les_fonctions_de_hachage_cryptographiques
- [7] https://www.lirmm.fr/~seriai/encadrements/theses/rafat/uploads/Main/rafat.pdf
- [8] https://www-inf.telecom-sudparis.eu/COURS/CSC3101/Supports/fise/cours-tp.pdf
2. Méthode par division (pour entiers)¶
int hashDivision(int nombre, int tailleTable) {
return nombre % tailleTable; // Préférer tailleTable = nombre premier
}
3. Méthode de pliage pour chaînes¶
Méthode de pliage : principe général¶
Le pliage est une technique de hachage qui consiste à :
- Découper la chaîne en blocs de taille fixe
- Combiner ces blocs via des opérations arithmétiques/bit à bit
- Réduire le résultat final à la taille de la table
Exemple Java avec addition¶
public class FoldingHash {
// Méthode de pliage pour chaîne avec blocs de 4 caractères
public static int foldHash(String key, int tableSize) {
int sum = 0;
int blockSize = 4;
for (int i = 0; i < key.length(); i += blockSize) {
int block = 0;
// Création du bloc
for (int j = 0; j < blockSize; j++) {
if (i + j < key.length()) {
block = (block << 8) | key.charAt(i + j); // Décalage + OR
}
}
sum += block; // Combinaison par addition
}
return Math.abs(sum % tableSize); // Réduction finale
}
public static void main(String[] args) {
String input = "hachage";
int size = 1000;
System.out.println("Hash de '" + input + "': " + foldHash(input, size));
}
}
Exécution :
Caractéristiques clés¶
- Taille de bloc : Généralement 32 ou 64 bits (4/8 caractères ASCII)
- Opérations : Addition, XOR ou combinaison de bits
- Performance : O(n) pour des chaînes de longueur modérée
Avantages/inconvénients¶
Avantage | Inconvénient |
---|---|
Bonne distribution pour données structurées | Collisions avec permutations |
Rapide à calculer | Sensible aux motifs répétitifs |
Simple à implémenter | Taille de bloc critique |
Cas d’utilisation typiques¶
- Bases de données : Indexation de clés composites
- Cache mémoire : Adressage de blocs de données
- Vérification d’intégrité : Somme de contrôle rapide
Variante avec XOR¶
Analyse de collision¶
Pour “chat” et “tcha” (mêmes caractères, ordre différent) :
System.out.println(foldHash("chat", 1000)); // 295
System.out.println(foldHash("tcha", 1000)); // 295 (collision)
Optimisations possibles¶
- Padding intelligent : Remplissage avec valeurs aléatoires au lieu de zéros
- Taille de bloc dynamique : Adaptation basée sur la longueur de la chaîne
- Combinaison d’opérations : Mélange d’addition et de XOR
Cette méthode est particulièrement efficace pour les chaînes longues et structurées, mais nécessite un choix judicieux de la taille de bloc et des opérations de combinaison pour minimiser les collisions[1][3].
Citations
- [1] https://fr.wikipedia.org/wiki/Fonction_de_hachage
- [2] https://fr.wikipedia.org/wiki/Java_hashCode()
- [3] https://jipe.developpez.com/articles/algo/table-hachage/?page=theorie
- [4] https://codegym.cc/fr/groups/posts/fr.210.code-de-hachage-java-
- [5] https://jipe.developpez.com/articles/algo/table-hachage/?page=pratique-implementation-en-java
- [6] https://codegym.cc/fr/groups/posts/fr.849.chanes-java
- [7] http://gallium.inria.fr/~maranget/X/421/poly/assoc.html
- [8] https://fr.wikibooks.org/wiki/Les_fonctions_de_hachage_cryptographiques
4. Hash polynomial (utilisé en Java pour les strings)¶
Applications au-delà de Java¶
Structures de données¶
Application | Utilisation du hash |
---|---|
Tables de hachage | Indexation rapide des clés |
Caches | Identification des données fréquentes |
Bloom filters | Test d’appartenance à un ensemble |
Sécurité informatique¶
- Stockage de mots de passe : Salage + hash (ex : bcrypt, PBKDF2)
- Vérification d’intégrité : Checksums (MD5, SHA-256)
- Signatures numériques : Hash du document signé cryptographiquement
Réseau et systèmes distribués¶
- Partitionnement de données : Sharding dans les bases distribuées
- Load balancing : Répartition des requêtes via consistent hashing
- Déduplication : Identification des fichiers dupliqués
Comparaison fonctions simples vs cryptographiques¶
Caractéristique | Hash simple | Hash cryptographique |
---|---|---|
Vitesse | Rapide (ns) | Lent (μs-ms) |
Collisions | Tolérées | Inacceptables |
Usage typique | Tables de hachage | Signature digitale |
Exemples | Java hashCode() | SHA-256, Blake3 |
Un cas concret en cryptomonnaie : Bitcoin utilise double SHA-256 pour :
- Vérifier l’intégrité de la blockchain
- Miner des blocs via preuve de travail
- Générer des adresses wallet à partir de clés publiques
Ces principes montrent comment une fonction mathématique apparemment simple devient un pilier des systèmes informatiques modernes, des structures de données basiques à la sécurité des transactions financières.
Citations
- [1] https://en.wikipedia.org/wiki/Hash_function
- [2] https://en.wikipedia.org/wiki/Cryptographic_hash_function
- [3] https://www.crowdstrike.com/en-us/cybersecurity-101/data-protection/data-hashing/
- [4] https://corporatefinanceinstitute.com/resources/cryptocurrency/hash-function/
- [5] https://www.prasams.com/the-basics-of-hashing-a-key-concept-in-computer-science/
- [6] https://codefinity.com/blog/Overview-of-Hashing-and-its-Applications
- [7] https://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200101/homework10/hashfuncs.html
- [8] https://opendsa-server.cs.vt.edu/ODSA/Books/CS3/html/HashFuncExamp.html
- [9] https://www.investopedia.com/terms/h/hash.asp
- [10] https://emeritus.org/blog/cybersecurity-what-is-hashing-in-cybersecurity/
- [11] https://www.practicalnetworking.net/series/cryptography/hashing-algorithm/
- [12] https://www.okta.com/identity-101/hashing-algorithms/
- [13] https://www.ionos.ca/digitalguide/server/security/hash-function/
- [14] https://softwareengineering.stackexchange.com/questions/372153/what-is-an-example-for-a-one-way-hash-function
- [15] https://enthec.com/en/what-is-hashing-how-it-works-and-uses-it-in-cybersecurity/
- [16] https://www.tutorialspoint.com/cryptography/cryptography_hash_functions.htm
- [17] https://www.spiceworks.com/it-security/data-security/articles/what-is-hashing/
Fonction de hachage : concept clé pour hashCode()
¶
Une fonction de hachage est un mécanisme qui transforme des données de taille variable (comme un objet Java) en une
valeur numérique fixe (généralement un entier). Dans le contexte de Java, cette valeur est utilisée par des structures
de données comme HashMap
ou HashSet
pour stocker et retrouver rapidement des objets.
Caractéristiques essentielles¶
- Déterministe : Même entrée → même sortie (crucial pour les collections)
- Performance : Calcul rapide (appelée fréquemment dans les collections)
- Distribution : Doit disperser uniformément les codes pour éviter les collisions
Application à hashCode()
¶
Pourquoi est-ce important ?
Quand vous stockez un objet dans un HashMap
, Java :
- Calcule le
hashCode()
pour déterminer le “seau” (bucket) de stockage - Utilise
equals()
seulement si plusieurs objets ont le même hash (collision)
Propriétés clés (contrat Java)¶
- Cohérence : Même objet → même hash (pendant toute sa durée de vie)
- Compatibilité avec equals() : Si
a.equals(b)
alorsa.hashCode() == b.hashCode()
- Pas l’inverse : Deux objets différents peuvent avoir le même hash (collision acceptable)
Exemple concret¶
Map map = new HashMap<>();
Point p1 = new Point(1, 2);
map.put(p1, "test");
// Recherche basée sur hashCode() puis equals()
System.out.println(map.get(new Point(1, 2))); // "test" si bien implémenté
Les fonctions de hachage cryptographiques (comme SHA) partagent certains principes, mais hashCode()
en Java a des
exigences différentes : performance > sécurité.
Citations
- [1] https://zestedesavoir.com/tutoriels/1895/les-fonctions-de-hachage-cryptographiques/
- [2] https://fr.wikipedia.org/wiki/Fonction_de_hachage_cryptographique
- [3] https://fr.wikipedia.org/wiki/Fonction_de_hachage
- [4] https://vitrinelinguistique.oqlf.gouv.qc.ca/fiche-gdt/fiche/12399801/code-de-hachage
- [5] https://www.okta.com/fr/identity-101/hashing-algorithms/
- [6] https://www.ionos.fr/digitalguide/sites-internet/developpement-web/hachage/
- [7] https://www.mailinblack.com/ressources/glossaire/le-hachage-une-methode-de-securite-infaillible/
- [8] https://www.dashlane.com/fr/blog/quest-ce-que-le-hachage-des-mots-de-passe
Utilisation de l’IA
Page rédigée en partie avec l’aide d’un assistant IA, principalement à l’aide de Perplexity AI, avec le LLM Claude 3.5 Sonnet. L’IA a été utilisée pour générer des explications, des exemples et/ou des suggestions de structure. Toutes les informations ont été vérifiées, éditées et complétées par l’auteur.