Gibt es eine Möglichkeit, den HashCode eines InputStream in Java abzurufen? Ich versuche, ein Bild mit <p:fileUpload/> von PrimeFaces hochzuladen, es in einen HashCode zu konvertieren und es mit einem anderen Bild zu vergleichen.

Im Moment versuche ich Folgendes:

public void save(FileUploadEvent event) throws IOException {
        HashCode hashCode = null;
        HashCode hashCodeCompare = null;
        hashCode = Files.asByteSource(new File(event.toString())).hash(Hashing.murmur3_128(50));
        hashCodeCompare = Files.asByteSource(new File(FilePathOfFileToCompare)).hash(Hashing.murmur3_128(50));
        boolean hashTrueFalse;
        if(hashCode.equals(hashCodeCompare)) {
            System.out.println("true");
        } else{
            System.out.println("false");
        }

        try (InputStream input = event.getFile().getInputstream()) {
            String imageName = generateFileName() + "." + fileExtensions(event.getFile().getFileName());
            String imageLink = PICTURE_DESTINATION + "\\" + imageName;


            Picture picture = new Picture();
            picture.setPictureUrl(imageLink);
            pictureService.createOrUpdate(picture);

            personForm.getCurrentPersonDTO().setPictureDTO(pictureMapper.toDTO(picture));


        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Gibt es eine Möglichkeit, InputStream in einen Hashcode umzuwandeln?

7
W.E.B-Developer 18 Jän. 2019 im 17:38

3 Antworten

Beste Antwort

Sie müssen den InputStream lesen, wenn Sie einen Hash für die darin enthaltenen Bytes berechnen möchten. Lesen Sie zuerst den InputSteam in ein Byte [].

Verwenden Sie mit Guava ByteStreams:

InputStream in = ...;
byte[] bytes = ByteStreams.toByteArray(in);

Eine alternative, beliebte Methode hierfür ist die Verwendung von Commons IO:

InputStream in = ...;
byte[] bytes = IOUtils.toByteArray(in);

Dann können Sie Arrays.hashCode () für das Byte-Array aufrufen:

int hash = java.util.Arrays.hashCode(bytes);

Sie können jedoch stattdessen SHA256 als Hash-Funktion verwenden, da die Wahrscheinlichkeit einer Kollision geringer ist:

MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] sha256Hash = digest.digest(bytes);

Wenn Sie nicht den gesamten Stream in ein Byte-Array im Speicher lesen möchten, können Sie den Hash berechnen, während der InputStream von einer anderen Person gelesen wird. Beispielsweise möchten Sie den InputStream möglicherweise auf die Festplatte in eine Datenbank streamen. Guava bietet eine Klasse, die einen InputStream umschließt, der dies für Sie erledigt. HashingInputStream :

Wickeln Sie Ihren InputStream zuerst mit einem HashinInputStream ein

HashingInputStream hin = new HashingInputStream(Hashing.sha256(), in);

Lassen Sie dann den HashingInputStream nach Belieben lesen

while(hin.read() != -1);

Dann holen Sie sich den Hash aus dem HashingInputStream

byte[] sha256Hash = hin.hash().asBytes();
4
bhspencer 1 Feb. 2019 im 15:14

Was Sie tun möchten, ist ByteStreams.copy(input, Funnels.asOutputStream(hasher)), wobei hasher von z. Hashing.sha256().newHasher(). Rufen Sie dann hasher.hash() auf, um das resultierende HashCode zu erhalten.

4
Louis Wasserman 19 Jän. 2019 im 06:21

Ich würde vorschlagen, Files.asByteSource(fileSource.getFile()).hash(hashFunction).padToLong() zu verwenden

0
Warren Zhu 29 Mai 2019 im 01:37