Syfte att spara diskplats ??
(några hann före...)
Spara hash-summa på filerna och stoppa i databas när de laddas upp och försöker man med samma igen (även med annan filnamn) så neka och meddela att den finns redan uppladdad och den nyss uppladdade raderas - om möjligt försöker man med javascript få browsern att hasha igenom filen lokalt innan den sänds upp till webservern för att minska både blockering av port i webservern med uppladdning och minska beräkningslasten i webservern.
Dock måste man hantera situationen om flera olika användare sparar upp samma bilder/filmer så att det inte blir stopp för att någon annan redan kört upp samma bild/film och att hashsumman också försvinner i databasen när sista exemplaret av filen raderas.
Använd helst inte md5 eller SHA1 utan hellre blake2b eller långsammare SHA256 då md5 och SHA1 numer anses svaga hash med för hög risk för hashkrock och med SHA1 så finns det redan 2 pdf-filer med samma SHA1 men olika innehåll skapad av Google för att bevisa SHA1:s otillräckliga styrka och det var påfallande många dokumenthanteringssystem som krashade mycket elakt till regelrätta totala haverier när folk började skicka in just dessa två dokument i systemet för några år sedan - att somliga fick tom. förbjuda pdf-dokument som giltig dokumentformat... även GIT var i ropet då de också använder SHA1 men där är användningen på sådan sätt att det inte blev några allvarliga konsekvenser i sin inre struktur utan filen med samma hash-värde man försök sända upp helt enkelt inte accepterades.
Så vilken lösning du än väljer - prova med dessa 2 olika pdf med samma SHA1 hash och se att det hanteras rimlig - för någon kommer att göra det förr eller senare
---
Att fånga 'liknande' filmer/bilder är helt annan scoop och det är sådant som google och andra stora sökmotorer och sociala medier sysslar med i stora dataparker och mycket avancerade icke publika algoritmer som hela tiden förbättras och putsas på
---
Eller så sköter man det tyst i bakgrunden på servern med att göra fil-mässig deduplikation så att lika filer hårdlänkas och om det är på BTRFS att de reflinkas för att spara diskplats och det finns flera program kan göra sådant, men tex. 'rmlint' kan både hårdlänka dubbletter eller i BTRFS filsystem göra reflink på filerna som den hittar när den går igenom filträden och den går inte på filnamnen utan tittar på innehållet och identifierar lika filer även under olika filnamn och olika platser i filträdet. - rmlint i sig tar inte bort eller deduplicerar filer - den skapar en bash-script som gör jobbet när den senare körs.
btrfs 'reflink' eller cloning är att föredra framför hård länk då filen är 'unik' och kan modifieras var och en utan att det slår på motsvarande referenser på andra ställen i filträdet medans Unix/linux hårda länkar pekar de olika namnen på samma 'inod' (som hantera filkroppen) vilket innebär att om man via ett filnamn modifierar filen så kommer modifikationerna också slå på de andra referenserna från andra filnamn i filträdet - och modifikation kan vara så enkelt som rättigheter då det lagras i själva inoden och är lika för alla filnamn som refererar till inoden.
För närvarande är det bara BTRFS och XFS som stöder 'reflink' i filsystem - ZFS 'borde' ha den men ingen har implementerat detta i open ZFS fast det har gått 10 år minst fast de senare stängda kommersiella ZFS har reflink implementerat.
Programmet rmlint kan dessutom rätt flagga satt sätta blake2-hashsumma och mtime för filen som xattr-värde för var fil den går igenom i filträdet (går i ext4 och BTRFS-filsystem och troligen också i xfs och zfs) och den vägen gör att sökningen nästa gång går väldigt mycket fortare för orörda filer i filträdet och hashar om bara för nya och ändrade filer.
Snapshot av subvolym med BTRFS-filystem tar med alla checksummor som lagras som attribut på filerna i subvolumen som rmlint en gång gått igenom - och tex att med rmlint jämföra snapshot B med snapshot A och göra script som tar bort alla filer i snapshot B som också finns i snapshot A kan gå på bara några minuter fast det är TB-stora instanser och miljoner filer.
Om man har BTRFS som filsystem så kan man också prova med 'bees' som gör en blockmässig deduplikation på hela filsystemet och identifierar ned till 4k-sektornivå även avsnitt i filer som är lika mellan olika filer så att de senare efter deduplikation vid läsning pekar på en och samma sektor eller sektorgrupp - dock kan det få senare läsprestadamässig påverkan då filer med mycket gemensam data med andra filer med deduplicering blir mer eller mindre hårt fragmenterade, vilket sölar ned vid läsning från snurrdisk, kort sagt man byter bättre packning för att spara diskplats mot prestandaförlust vid läsning av filerna!.
ZFS har också funktion där det dedupliceras automatisk vid skrivning till lagring - men kräver 1 GB RAM per TB disk för hash-tabellerna samt dess SHA256-hasning av all data sänker prestandan mer än märkbart - så där behöver man ha en server med muskler och mycket RAM (helst ECC-RAM)