179 lines
4.3 KiB
Markdown
179 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_
|