Есть ли способ получить хэш-код InputStream с помощью Guava? - PullRequest
0 голосов
/ 18 января 2019

Есть ли способ получить HashCode InputStream в Java, Я пытаюсь загрузить изображение с помощью <p:fileUpload/> из PrimeFaces, преобразовать его в HashCode и сравнить его с другим изображением.

На данный момент я пытаюсь это:

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();
        }
    }

Есть ли способ превратить InputStream в хеш-код?

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Что вы хотите сделать, это ByteStreams.copy(input, Funnels.asOutputStream(hasher)), где hasher получено, например, из Hashing.sha256().newHasher(). Затем позвоните hasher.hash(), чтобы получить полученный HashCode.

0 голосов
/ 29 мая 2019

Я бы предложил использовать Files.asByteSource(fileSource.getFile()).hash(hashFunction).padToLong()

0 голосов
/ 18 января 2019

Вы должны прочитать InputStream, если вы собираетесь вычислять хеш на байтах, которые он содержит. Сначала прочитайте InputSteam в байт [].

При использовании Guava ByteStreams:

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

Альтернативный популярный способ сделать это - использовать Commons IO :

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

Затем вы можете вызвать Arrays.hashCode () для байтового массива:

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

Однако вы можете рассмотреть возможность использования SHA256 в качестве хэш-функции, поскольку вероятность возникновения коллизии у вас меньше:

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

Если вы не хотите читать весь поток в байтовый массив в памяти, вы можете вычислить хэш, когда InputStream читается кем-то другим. Например, вы можете захотеть передать поток InputStream на диск в базу данных. Guava предоставляет класс, который упаковывает InputStream, который делает это для вас HashingInputStream :

Сначала оберните ваш InputStream с помощью HashinInputStream

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

Тогда пусть этот HashingInputStream будет прочитан так, как вам нравится

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

Затем получите хеш из HashingInputStream

byte[] sha256Hash = hin.hash().asBytes();
...