02. november 2005 - 20:38Der er
34 kommentarer og 1 løsning
checksum af fil - eller anden idendifikation
Hej
Jeg har en del musik som jeg vil have lavet en database over. Jeg sidder så og tænker over hvordan jeg kan lave en checksum eller anden identifikation til filen?
Jeg skal have lavet et ID til hver eneste fil som så skal virke som ID i min database. Det skal helst virke således så selvom man ændrer stien til filen, at databasen stadig kan genkende filen, men det vil jo være lidt dumt at skrive et helt filnavn i min database, da det jo vil tage alt for mange resourcer
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
En hash værdi er en streng bestående af en masse underlige tegn, genereret ud fra en given streng, og hash værdien kan ikke laves om til original strengen igen.
En hash er meget kort - for MD5 bliver den gemt som 32 tegn. Ved CRC32 skal du kun bruge 8.
Det vil dog tage en del resourcer at beregne den, hvilket er grunden til du nok bør bruge CRC32 som hmortensen foreslår - den er ikke så kompliceret at beregne, så der bruges ikke så mange resourcer.
At udregne en crc32 for over 1000 filer vil måske ikke gå helt vildt hurtigt, og chancen for at flere filer vil have samme checksum er vel "rimelig" stor?
Måske skulle man lave indifikation på en lidt anden måde?
Jeg ved ikke om det evt. ville gå hurtigere hvis havde 2 felter som var primary keys? Altså en med crc32 af filnavnet (ikke hele filen) og det andet felt vil være stien til filen som integer. Så der findes en anden table med id og path? Hvis man kan følge mig? Eller er det en endnu bedre metode? :)
Jeg ved ikke om det evt. ville gå hurtigere hvis man havde 2 felter med primary keys? Altså et med crc32 af filnavnet (ikke hele filen) og det andet ville være stien til filen som integer (id på stien). Ved siden af findes så en table med id og sti? Hvis man kan følge mig? Men her kan man så ikke ændre sti til filer uden at det vil få konsekvenser
Chancen for at der er kollision mellem 2 forskellige filer er 1 til 2^32. Hvis du samtidigt gemmer filstørrelse, er chancen endnu mindre.
Hvis du laver en CRC32 af filnavnet, ender du med samme problem - du har ingen mulighed for at finde en omdøbt fil.
Tanken er at du ved upload udregner CRC32 for filen, og gemmer den i databasen. På den måde skal du kun checke EN gang.
En yderligere fordel ved at bruge CRC32 frem for noget andet, er at du kan omdanne den til et tal der kan være i en INT kolonne. Det gør søgning hurtigere hvis du har indekseret kolonnen.
Eksempel på en brugbar tabelstruktur:
filcrc (P) filsize (P) filsti +de oplysninger du ellers vil gemme (kunstner, titel, etc.)
For at beregne CRC32 på en eksisterende fil, skal du sætte dit filnavn ind i file_get_contents(). Vær opmærksom på du muligvis skal øge den mængde hukommelse PHP må bruge.
CRC'en ændrer sig ikke hvis du omdøber en fil. Den ændrer sig kun hvis du ændrer selve filens indhold, såsom ID3 tag. Derfor er det mere fleksibelt at beregne på filens indhold.
Desuden kan jeg melde om at min bærbare er ca. 2 sekunder om at beregne CRC32 for en 5MB stor fil, og da det kun skal gøres en gang...
Alternativ til crc32 af hele filens indhold, kunne man så ikke gøre noget i stil med det her? Her ville man vel også få mindst chance for at 2 filer kommer til at virke synkrone
Som sagt så mange gange før - hvis du bruger CRC32 til filnavn mister du al mulighed for omdøbning, og muligvis også flytning (afhængig af om du også tager stien med).
Du skal have EKSTREMT mange filer før det reelt kan betale sig kun at operere på filnavn, da en CRC32 på 5MB som nævnt kun tager et sekund eller to.
Endelig er der jo heller ikke megen ide i at gøre det med mindre du gemmer filnavnet andetsteds, da du jo ikke har mulighed for at vide hvad der er hvad - en CRC32 kan ikke bruges til at genskabe det originale indhold.
Du kan godt have to filer der er lige store, uden at de er identiske. Derfor holder den ide ikke.
Mht. til ID3, så vil dine filer ændre sig uanset. Filstørrelsen ændrer sig ikke ved ID3v1 (så længe der er et tag defineret), men den gør den nu ved ID3v2 (husk på vi snakker ned på byte niveau), da tagget ellers ike vil kunne blive læst ordentligt (grundet formatets definition).
jeg synes altså heller ikke at filstørrelsen ændrer sig i ID3v2.. har selv lige prøvet at have helt tomme felter og dernest alle udfyldte, uden det ændrer sig (tæller bytes)
jeg ville nu heller ikke kun have id på filstørrelsen, men en delt primær nøgle på filstørrelse og crc32 på filnavnet
Det eneste ID3v2 format der kan gøre det, er v2.4, og selv der kræver det at din tagger er sat op til at kunne gøre det (det er muligt at lave padding i v2.4, men ikke i v2.2. eller v2.3).
Det er bedre med den delte nøgle, men igen, dubletter. Er det virkelig det værd bare for at spare nogle få minutter når du lave din indledende database?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.