4NK_IA_front/docs/HASH_SYSTEM.md
Nicolas Cantu c6b5767d5d feat: Implémentation du système de cache JSON et de hash pour les uploads
- Ajout du système de hash SHA-256 pour éviter les doublons d'upload
- Implémentation du cache JSON pour sauvegarder les résultats d'extraction
- Nouvelles fonctions: calculateFileHash, findExistingFileByHash, saveJsonCache, getJsonCache
- Nouvelles routes API: /api/cache, /api/cache/:hash, /api/uploads
- Optimisation des performances: réutilisation des résultats en cache
- Documentation mise à jour: API_BACKEND.md et nouveau fichier HASH_SYSTEM.md
- Ajout du dossier cache/ au .gitignore
2025-09-16 02:01:38 +02:00

169 lines
4.3 KiB
Markdown

# 🔐 Système de Hash pour la Gestion des Doublons
## 📋 **Vue d'ensemble**
Le système de hash SHA-256 a été implémenté dans le backend 4NK_IA pour éviter les doublons d'upload et optimiser le stockage des fichiers. Ce système garantit qu'un fichier identique ne sera traité qu'une seule fois, même s'il est uploadé plusieurs fois.
---
## 🔧 **Fonctionnement**
### **1. Calcul du Hash**
- Chaque fichier uploadé est analysé pour calculer son hash SHA-256
- Le hash est calculé sur le contenu binaire complet du fichier
- Utilisation de la fonction `crypto.createHash('sha256')` de Node.js
### **2. Détection des Doublons**
- Avant traitement, le système vérifie si un fichier avec le même hash existe déjà
- La fonction `findExistingFileByHash()` parcourt le dossier `uploads/`
- Si un doublon est trouvé, le fichier uploadé est supprimé
### **3. Traitement Optimisé**
- Le traitement utilise le fichier existant (pas le doublon)
- Les résultats d'extraction sont identiques pour les fichiers identiques
- Économie de ressources CPU et de stockage
---
## 📁 **Structure des Fichiers**
```
uploads/
├── document-1757980637671.pdf # Fichier original
├── document-1757980640576.pdf # Doublon (supprimé après traitement)
└── image-1757980651234.jpg # Autre fichier unique
```
---
## 🔍 **API Endpoints**
### **GET** `/api/uploads`
Liste tous les fichiers uploadés avec leurs métadonnées :
```json
{
"files": [
{
"name": "document-1757980637671.pdf",
"size": 1015808,
"hash": "a1b2c3d4e5f6789...",
"uploadDate": "2025-09-15T23:56:14.751Z",
"modifiedDate": "2025-09-15T23:56:14.751Z"
}
],
"count": 1,
"totalSize": 1015808
}
```
---
## 📊 **Logs et Monitoring**
### **Logs de Hash**
```
[HASH] Hash du fichier: a1b2c3d4e5f6789...
[HASH] Fichier déjà existant trouvé: document-1757980637671.pdf
[HASH] Nouveau fichier, traitement normal
```
### **Indicateurs de Performance**
- **Temps de traitement réduit** pour les doublons
- **Stockage optimisé** (pas de fichiers redondants)
- **Logs clairs** pour le debugging
---
## 🛠️ **Fonctions Techniques**
### **`calculateFileHash(buffer)`**
```javascript
function calculateFileHash(buffer) {
return crypto.createHash('sha256').update(buffer).digest('hex')
}
```
### **`findExistingFileByHash(hash)`**
```javascript
function findExistingFileByHash(hash) {
const uploadDir = 'uploads/'
if (!fs.existsSync(uploadDir)) return null
const files = fs.readdirSync(uploadDir)
for (const file of files) {
const filePath = path.join(uploadDir, file)
try {
const fileBuffer = fs.readFileSync(filePath)
const fileHash = calculateFileHash(fileBuffer)
if (fileHash === hash) {
return { path: filePath, name: file }
}
} catch (error) {
console.warn(`[HASH] Erreur lors de la lecture de ${file}:`, error.message)
}
}
return null
}
```
---
## ✅ **Avantages**
1. **Économie de Stockage** : Pas de fichiers dupliqués
2. **Performance** : Traitement plus rapide pour les doublons
3. **Cohérence** : Résultats identiques pour fichiers identiques
4. **Monitoring** : Visibilité sur les fichiers stockés
5. **Sécurité** : Hash SHA-256 cryptographiquement sûr
---
## 🔄 **Workflow d'Upload**
```mermaid
graph TD
A[Fichier Uploadé] --> B[Calcul Hash SHA-256]
B --> C{Hash Existe?}
C -->|Oui| D[Supprimer Doublon]
C -->|Non| E[Conserver Fichier]
D --> F[Utiliser Fichier Existant]
E --> G[Traitement Normal]
F --> H[Extraction & NER]
G --> H
H --> I[Résultat JSON]
```
---
## 🧪 **Tests**
### **Test de Doublon**
```bash
# Premier upload
curl -X POST -F "document=@test.pdf" http://localhost:3001/api/extract
# Deuxième upload du même fichier
curl -X POST -F "document=@test.pdf" http://localhost:3001/api/extract
```
### **Vérification**
```bash
# Lister les fichiers uploadés
curl http://localhost:3001/api/uploads
```
---
## 📝 **Notes d'Implémentation**
- **Algorithme** : SHA-256 (256 bits)
- **Performance** : O(n) pour la recherche de doublons
- **Stockage** : Hash stocké en hexadécimal (64 caractères)
- **Compatibilité** : Fonctionne avec tous les types de fichiers supportés
- **Nettoyage** : Suppression automatique des doublons temporaires
---
*Documentation mise à jour le 15 septembre 2025*