Un hash seminato con qualcosa di statico (come il nome di un file o il file reale) ti dirà se c'è una corrispondenza esatta, ma non ti aiuterà con somiglianza, poiché gli hash divergeranno significativamente anche con modifiche minori. Quindi hai due opzioni:
1. Ignora il problema ...
... e assicurati solo che i file non entrino in collisione tra loro, anche se sono duplicati (il più veloce).
Questo è il punto in cui gli hash diventano utili: seminare un hash con qualcosa di relativamente unico garantisce virtualmente la possibilità di fare riferimento univocamente a un file, anche se il suo nome file è uguale o l'immagine è simile. Il valore di questo, specialmente in una scheda immagine, è per i CDN: la maggior parte dei CDN generalmente determina i duplicati in base al nome del file (perché è veloce). Quindi se qualcuno apporta una modifica a un'immagine ma usa lo stesso nome di file, la CDN ignorerà la nuova versione.
Quindi, se il tuo nome file è foo.jpg
, potresti creare un hash usando qualcosa come
list(basename, extension) = split(filename, '.')
hash = md5(filename . ':' . time())
filename = basename . '_' . hash . extension
E arriva a qualcosa come foo_a23aed3a298ae.jpg
. Poiché il nome base e l'estensione non cambiano, sarebbe banale generare il nome del file originale.
Inoltre, poiché l'hash è stato seminato con il tempo, dovresti avere un hash per lo più unico, anche quando i due file sono per lo più gli stessi.
2. Calcola i criteri di somiglianza delle immagini una volta ...
... e memorizza i risultati nei metadati dell'immagine o in un database separato (più lento, ma con maggiori possibilità di salvataggio).
Questo andrebbe di pari passo con la prima opzione.
Qualsiasi buona libreria di immagini fornirà una grande quantità di dati su un'immagine che è possibile utilizzare per creare una formula di confronto tra due immagini. Quindi memorizzerai quei dati nell'immagine stessa (accessibili tramite metadati come EXIF o IPTC) o in un database a cui fa riferimento l'hash univoco dell'immagine.
Naturalmente, in questo scenario, stai cercando nel database tutte le corrispondenze. Potresti risparmiare un po 'di tempo aggiungendo i metadati importanti al nome del file:
foo_200x200_300dpi_cats_a23aed3a298ae.jpg
Tuttavia, a seconda della quantità di immagini che devi ordinare, questo può essere molto costoso e probabilmente supererebbe il costo dello spazio di archiviazione aggiuntivo.