Лучший способ обнаружить дубликаты загруженных файлов в среде Java? - PullRequest
3 голосов
/ 16 сентября 2010

Как часть веб-приложения на основе Java, я собираюсь принимать загруженные файлы .xls & .csv (и, возможно, другие типы). Каждый файл будет уникально переименован с помощью комбинации параметров и отметки времени.

Я бы хотел иметь возможность идентифицировать любые дубликаты файлов. Под дубликатом я подразумеваю один и тот же файл независимо от имени. В идеале я хотел бы иметь возможность обнаруживать дубликаты как можно быстрее после загрузки, чтобы сервер мог включить эту информацию в ответ. (Если время обработки по размеру файла не вызывает слишком большой задержки.)

Я читал о запуске MD5 для файлов и сохранении результата в виде уникальных ключей и т. Д. * , но у меня есть подозрение, что есть гораздо лучший способ. (Есть ли лучший способ?)

Любые советы о том, как лучше к этому подойти, приветствуются.

Спасибо.

UPDATE: Я ничего не имею против использования MD5. Я использовал его несколько раз в прошлом с Perl ( Digest :: MD5 ). Я думал, что в мире Java могло бы появиться другое ( лучше ) решение. Но, похоже, я ошибся.

Спасибо всем за ответы и комментарии. Теперь я чувствую себя хорошо, используя MD5.

Ответы [ 2 ]

6 голосов
/ 16 сентября 2010

При обработке загруженных файлов, украсьте OutputStream с DigestOutputStream, чтобы вы могли вычислить дайджест файла во время записи. Сохраните последний дайджест где-нибудь вместе с уникальным идентификатором файла (возможно, в шестнадцатеричном виде как часть имени файла?).

1 голос
/ 16 сентября 2010

Вам нужно только добавить такой метод в ваш код, и все готово.Там, вероятно, нет лучшего способа.Вся работа уже выполнена Digest API.

public static String calc(InputStream is ) {
        String output;
        int read;
        byte[] buffer = new byte[8192];

        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256"); //"MD5");
            while ((read = is.read(buffer)) > 0) {
                digest.update(buffer, 0, read);
            }
            byte[] hash = digest.digest();
            BigInteger bigInt = new BigInteger(1, hash);
            output = bigInt.toString(16);

        } 
        catch (Exception e) {
            e.printStackTrace( System.err );
            return null;
        }
        return output;
    }
...