Сценарии Powershell могли бы быть полезными также и конечно более гибкими, чем xcopy и другие команды DOS. Можно легко рекурсивно вызвать через подкаталоги, отфильтровать файлы по имени или расширения, обработка особенно некоторые конкретные файлы на основе критериев по Вашему выбору, и т.д. , веб-сайт сообщества Powershell является хорошей начальной точкой.
я использую хэш SHA1 на основе содержимого. MD5 слабее и быстрее, но на современных процессорах скорость не является проблемой.
Также я должен отметить, что этот отличный ответ от jarnbjo указывает на то, что даже предоставленное хеширование SHA в Java вполне способно превысить 20 МБ / с даже на относительно скромном оборудовании x86. Это будет означать производительность уровня 5-10 миллисекунд на 100 КБ входных данных (в памяти), так что ваша цель менее 10 секунд - это значительная переоценка требуемых усилий. Вероятно, вы будете полностью ограничены скоростью чтения файлов с диска, а не каким-либо алгоритмом хеширования, который вы используете.
Если вам необходимо сильное крипто-хеширование, вы должны указать это в вопрос. Основные моменты из которых можно разделить на следующие (настройте размер буфера по своему усмотрению):
import java.io.*;
import java.security.MessageDigest;
public class Checksum
{
const string Algorithm = "SHA-1"; // or MD5 etc.
public static byte[] createChecksum(String filename) throws
Exception
{
InputStream fis = new FileInputStream(filename);
try
{
byte[] buffer = new byte[1024];
MessageDigest complete = MessageDigest.getInstance("MD5");
int numRead;
do
{
numRead = fis.read(buffer);
if (numRead > 0)
{
complete.update(buffer, 0, numRead);
}
} while (numRead != -1);
return complete.digest();
}
finally
{
fis.close();
}
}
}
вы можете использовать MessageDigest с SHA1 :
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
InputStream is = new FileInputStream(aFile);
int res;
while ((res = inputStream.read()) != -1) {
digester.update((byte) res);
}
byte[] digest = messageDigest.digest();
вот как я это делаю, Я думаю, это должно работать быстро, проверьте, завершится ли это за 10 секунд
package utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* This class used to compute the hash value of any string
*/
public class MyHasher {
private static final String ALGORITHM = "MD5";
static MessageDigest md = null;
static{
try {
md = MessageDigest.getInstance(ALGORITHM);
} catch (NoSuchAlgorithmException e) {
MyLogger.error("Can't find implementation of "+ALGORITHM+" algorithm", e);
}
}
/**
* Compute hash value of any string
* @param arg the string to compute hash value of.
* @return the hex hash value as a string.
*/
public static String getHash(String arg) {
md.update(arg.getBytes());
byte[] hashValue = md.digest();
return convertToHex(hashValue);
}
/**
* Converts byte array to the human readable string of hex'es
* @param data the byte array to convert
* @return string representation of the hex'es of the byte array
*/
public static String convertToHex(byte[] data){
StringBuffer buf = new StringBuffer();
for(int i=0;i<data.length;i++){
int halfbyte = (data[i]>>>3)&0x0F;
int two_halfs = 0;
do{
if((0<=halfbyte) && (halfbyte <=9))
buf.append((char) ('0'+halfbyte));
else
buf.append((char) ('a'+(halfbyte-10)));
halfbyte = data[i] & 0x0F;
}while(two_halfs++ <1);
}
return buf.toString();
}
}
, я использую хэш SHA1 на основе содержимого. MD5 слабее и быстрее, но на современных процессорах скорость не является проблемой.