Avatar billede supermand69 Nybegynder
02. november 2005 - 20:38 Der 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

Nogen som har ideer til hvad jeg kan gøre?
Avatar billede pidgeot Nybegynder
02. november 2005 - 20:44 #1
Gem en MD5 eller SHA1 i din database. Så længe filen er identisk med den gemte, vil du med 100% sikkerhed genkende den.

Vær dog opmærksom på at du ikke kan genkende en fil hvis der eks. ændres i dets tag.
Avatar billede supermand69 Nybegynder
02. november 2005 - 20:47 #2
altså.. en MD5 laver en kryptering af filnavnet ikk?
Avatar billede pidgeot Nybegynder
02. november 2005 - 20:50 #3
Nej - meningen er at du skal bruge MD5 til at lave en hash (MD5 er ikke kryptering!) af filens indhold. Det burde du kunne gøre med noget i stil med

<? $hash=md5(file_get_contents($filnavn)); ?>
Avatar billede hmortensen Nybegynder
02. november 2005 - 20:50 #4
Måske sådan her:
function checksum($file)
{
  return sprintf("%u", crc32(file_get_contents($file)));
}
Avatar billede supermand69 Nybegynder
02. november 2005 - 21:15 #5
hvad er en hash?

er ikke lige helt med her
Avatar billede hmortensen Nybegynder
02. november 2005 - 21:17 #6
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.
Avatar billede supermand69 Nybegynder
02. november 2005 - 21:27 #7
men vil det ikke tage mange resourcer hvis man bruger en hash som id i en database?
Avatar billede pidgeot Nybegynder
02. november 2005 - 21:29 #8
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.
Avatar billede supermand69 Nybegynder
04. november 2005 - 20:10 #9
hvordan kan jeg så beregne en fil fra et andet drev?

eks.
echo checksum('d:\dir\fil.mp3');

No such file or directory
Avatar billede supermand69 Nybegynder
04. november 2005 - 20:43 #10
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? :)
Avatar billede supermand69 Nybegynder
04. november 2005 - 20:48 #11
prøver lige igen.. hehe

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

Eller er der en endnu bedre metode? :)
Avatar billede supermand69 Nybegynder
04. november 2005 - 20:54 #12
eller hvad med crc32 af filnavn i et felt og crc32 af indhold af filen? :)

jeg ved ikke hvor mange resourcer det til tage?
Avatar billede pidgeot Nybegynder
04. november 2005 - 21:14 #13
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.
Avatar billede supermand69 Nybegynder
04. november 2005 - 21:54 #14
jeg tror lidt at det med at beregne crc32 for hele filen vil bruge for mange resourcer...

ville det ikke være lige så godt at lave crc32 af filnavnet og have filstørrelsen som primary key?
Avatar billede supermand69 Nybegynder
04. november 2005 - 21:57 #15
- for hvis du ændrer filnavet til både crc32 for filnavn og hele filen alligevel ændrer sig.. det samme for filstørrelsen

jeg går ud fra at jeg ikke ændrer noget i filen som ID3 eller filnavnet :)
Avatar billede supermand69 Nybegynder
04. november 2005 - 21:58 #16
til=vil
ændrer=ændre

er vist ved at være træt.. hehe
Avatar billede pidgeot Nybegynder
04. november 2005 - 22:11 #17
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...
Avatar billede pidgeot Nybegynder
04. november 2005 - 22:13 #18
i øvrigt tager det ca. lige så lang tid at beregne MD5 for samme fil ;)
Avatar billede supermand69 Nybegynder
05. november 2005 - 11:00 #19
kan jeg godt have alle udregningner fra crc32 i en INT(10)?
Avatar billede supermand69 Nybegynder
05. november 2005 - 11:10 #20
når jeg prøver at browse filer på et andet drev på serveren får jeg fejl?

checksum('e:\dir\fil.mp3');

No such file or directory
Avatar billede supermand69 Nybegynder
05. november 2005 - 11:46 #21
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

file_size
crc32(file_name)
path_id
Avatar billede pidgeot Nybegynder
05. november 2005 - 12:18 #22
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.
Avatar billede supermand69 Nybegynder
05. november 2005 - 12:55 #23
jamen jeg har lige observeret noget ret interessant... der må åbenbart være "reserveret" 255 tegn i hvert felt i ID3 :)

så længe man ikke sletter et helt felt eller skriver i et tomt ændrer filstørrelsen sig ikke
Avatar billede supermand69 Nybegynder
05. november 2005 - 13:02 #24
Nu kan man vel bare nøjes med at bruge filstørrelsen id, for man ændrer vel heller ikke filstørrelsen ved at ændre filnavnet?

Skal lige siges at det KUN er ved ID3v2, og at filstørrelsen heller ikke ændrer sig hvis man helt sletter felter eller skriver i tomme felter :)

Men jeg bruger også kun ID3v2...
Avatar billede pidgeot Nybegynder
05. november 2005 - 15:33 #25
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).
Avatar billede supermand69 Nybegynder
05. november 2005 - 15:55 #26
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
Avatar billede pidgeot Nybegynder
05. november 2005 - 16:06 #27
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?
Avatar billede supermand69 Nybegynder
06. november 2005 - 15:58 #28
kunne en crc32 så være i en int(10) eller skal man op i en bigint?
Avatar billede pidgeot Nybegynder
06. november 2005 - 16:00 #29
Det burde kunne være i en int(11), da der er tale om 32-bit.
Avatar billede supermand69 Nybegynder
06. november 2005 - 19:32 #30
int(11) ?

2^32 = 4294967296
Avatar billede supermand69 Nybegynder
06. november 2005 - 19:33 #31
du kan lige lave et svar samtidig :)
Avatar billede pidgeot Nybegynder
06. november 2005 - 19:39 #32
Den bliver returneret som en unsigned integer, så smid heller 11 på for en sikkerheds skyld. Det er desuden det PMA bruger som standard til en INT.

Og her er svaret :)
Avatar billede supermand69 Nybegynder
06. november 2005 - 20:05 #33
PMA?
Avatar billede pidgeot Nybegynder
06. november 2005 - 20:09 #34
PMA=PHPMyAdmin. Det værktøj mange bruger til at administrere MySQL databaser.
Avatar billede supermand69 Nybegynder
06. november 2005 - 20:12 #35
ja ok.. kendte ikke lige til den forkortelse

men tak for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester