Как хешировать файл, чтобы определить, вижу ли я его или нет - PullRequest
1 голос
/ 13 июля 2011

Я разрабатываю веб-приложение (использующее Java EE 6 с GF 3.1), которое позволяет пользователю загружать файл PDF.Поскольку это небольшое закрытое сообщество, есть много шансов, что загруженный файл уже находится в системе.Я не могу просто проверить имя на предмет дублирования, так как этого явно недостаточно.Я думал о хешировании всего файла и сохранении записи в базе данных.Возможно ли это и как этого добиться?Если нет, то что лучше.

Ответы [ 5 ]

4 голосов
/ 13 июля 2011

Рассмотрите возможность использования контрольной суммы.

Это от http://www.exampledepot.com/egs/java.util.zip/CalculateChecksum.html

byte[] bytes = "some data".getBytes();

// Compute Adler-32 checksum
Checksum checksumEngine = new Adler32();
checksumEngine.update(bytes, 0, bytes.length);
long checksum = checksumEngine.getValue();

// Compute CRC-32 checksum
checksumEngine = new CRC32();
checksumEngine.update(bytes, 0, bytes.length);
checksum = checksumEngine.getValue();

// The checksum engine can be reused again for a different byte array by calling reset()
checksumEngine.reset();

Редактировать :

Имейте в виду, что контрольные суммы не могут точно сказать вамесли два файла разные, но они очень полезны.

Если два файла одинаковы, у них будет одинаковая контрольная сумма.

Таким образом, если контрольные суммы различаются, вы абсолютно точно знаете, что файлы различаются.

Но два разных файла также могут иногда иметь одинаковую контрольную сумму.

Таким образом, способ использовать это, чтобы сначала вычислить контрольные суммы - если они различаются, файлы разные.Если они одинаковы, вам придется делать побайтовое сравнение.Это медленнее, конечно, но это случается не часто.

Обратите внимание также все это относится и к хеш-кодам.

2 голосов
/ 13 июля 2011

Да, это возможно.Фактически это то, что P2P-программы делают для идентификации файла.

Использование любого криптографического алгоритма хеширования (MD5, SHA-1 и т.MessageDigest class.

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

2 голосов
/ 13 июля 2011

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

В следующий раз, когда кто-нибудь загрузит файл, вычислит хеш, проверит базу данных, сохранит, если его там нет.

1 голос
/ 13 июля 2011

В прошлом я использовал Timothy W Macinta (возможно, SO User @Tim Macinta) «Быстрое внедрение MD5» .

Простейший пример:

// imports: java.io.File and com.twmacinta.util.MD5;

String hash = MD5.asHex(MD5.getHash(new File(filename)));

Эта утилита также имеет возможность использовать собственную библиотеку для повышения производительности.

1 голос
/ 13 июля 2011

Конечно, это возможно, вы можете использовать класс MessageDigest , чтобы сделать это.Например:

InputStream is = // input stream of the uploaded file
byte[] buffer = new byte[1024];
byte[] digest;
try {
    MessageDigest md = MessageDigest.getInstance("MD5");

    for (int count = is.read(buffer); count != -1; count = is.read(buffer)) {
        md.update(buffer, 0, count);
    }

    digest = md.digest();
    // store digest as needed, possibly Base64 encode first
}
catch (NoSuchAlgorithmException e) {
    // handle
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...