Avatar billede tripwire Nybegynder
26. marts 2004 - 12:59 Der er 8 kommentarer og
1 løsning

Hashcode på fil, ikke objekt

Hvordan får jeg hashcoden på en fil og ikke på objektet, i java??

jeg vil have det sådan, at en fil kan ligge på 2 forskellige maskiner og have samme hashcode. Filerne skal ikke nødvendigvis hedde det samme, ligge samme sted eller være oprettet samtidig, men sålænge indholdet af filerne er ens, så skal hashværdien være ens.

Og det skal altså kunne beregnes på alle slags filer, f.eks. .swf, .rar, .png osv.

hvordan får jeg java til det?? et lille eksempel ville være rart, hvis det kunne lade sig gøre..
Avatar billede europe Nybegynder
26. marts 2004 - 13:04 #1
Du skal "bare" lave en overriding af den methode der ligger på Object klassen i java

eks.
public int hashCode() {
  return x;
}

Hvor 'x' er en int - der på en eller anden måde fortæller fortæller om indholdet af klassen.
Avatar billede arne_v Ekspert
26. marts 2004 - 13:26 #2
Du bliver nødt til at læse hele filerne og hashe indholdet.

Der er klasser i Java som kan udregne hash af et byte array.
Avatar billede tripwire Nybegynder
26. marts 2004 - 16:11 #3
arne, du kan ikke huske hvad de klasser hedder, vel?? bare så jeg ved hvad jeg skal kigge efter..
Avatar billede tripwire Nybegynder
26. marts 2004 - 16:13 #4
kigger på noget Class ByteBuffer
Avatar billede arne_v Ekspert
26. marts 2004 - 17:42 #5
Du læser bare ind i et byte[] og så bruger du java.security.MessageDigest
med MD5 eller en anden algoritme.
Avatar billede arne_v Ekspert
26. marts 2004 - 17:43 #6
byte[] b;
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] b2 = md.digest(b);
Avatar billede arne_v Ekspert
26. marts 2004 - 17:47 #7
byte[] b = new byte[(int)(new File("C:\\fil.typ")).length()];
        InputStream is = new FileInputStream("C:\\fil.typ");
        is.read(b);
        is.close();
Avatar billede arne_v Ekspert
26. marts 2004 - 22:21 #8
Komplet eksempel:

import java.io.*;
import java.security.*;

public class FileHasher {
    public static String hash(String filename) throws IOException, NoSuchAlgorithmException {
        byte[] b = new byte[(int) (new File(filename)).length()];
        InputStream is = new FileInputStream(filename);
        is.read(b);
        is.close();
        MessageDigest md;
        md = MessageDigest.getInstance("MD5");
        return toHex(md.digest(b));
    }
    private static String toHex(byte[] ba) {
        char hexdigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < ba.length; i++) {
            sb.append(hexdigit[(ba[i] >> 4) & 0x0F]);
            sb.append(hexdigit[ba[i] & 0x0F]);
        }
        return sb.toString();
    }
    public static void main(String[] args) throws Exception {
        System.out.println(hash("C:\\x1.cpp"));
        System.out.println(hash("C:\\x2.cpp"));
    }
}
Avatar billede tripwire Nybegynder
26. marts 2004 - 23:13 #9
Arne.. det var præcis det jeg manglede... takker mange gange..
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
Kurser inden for grundlæggende programmering

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