使用 md5 扫描重复文档
Scan duplicate document with md5
由于某些原因我不能使用MessageDigest.getInstance("MD5")
,所以我必须手动编写算法代码,我的项目是扫描重复文档(*.doc,*.txt,*.pdf) Android 设备。我的问题是,在输入算法之前我必须写什么,才能扫描 Android 设备上 MY ROOT 目录中的重复文件?没有 select 目录,当我按下按钮扫描时,进程开始, listview
显示。有人可以帮助我吗?我的项目截止日期即将到来。非常感谢。
public class MD5 {
//What must I write here, so I allow to scan for duplicate document on Android root with MD5 Hash
//MD5 MANUAL ALGORITHM CODE
}
整个过程:
您的目标是检测(并可能存储有关)重复文件。
1 然后,首先,你必须遍历目录和文件,
看到这个:
list all files from directories and subdirectories in Java
2 对于每个文件,像字节数组一样加载它
看到这个:
Reading a binary input stream into a single byte array in Java
3 然后计算您的 MD5 - 您的项目
4 并存储此信息
您可以使用 Set 来检测重复项(Set 具有独特的元素)。
Set<String> files_hash; // each String is a string representation of MD5
if (files_hash.contains(my_md5)) // you know you have it already
或一个
Map<String,String> file_and_hash; // each is file => hash
// you have to iterate to know if you have it already, or keep also a Set
MD5 的答案:
读取算法:
https://en.wikipedia.org/wiki/MD5
RFC:https://www.ietf.org/rfc/rfc1321.txt
一些谷歌搜索...
这个演示文稿,一步一步
http://infohost.nmt.edu/~sfs/Students/HarleyKozushko/Presentations/MD5.pdf
或尝试复制 C(或 java)实现 ...
总体战略
要保持时间并加快处理速度,您还必须考虑函数的使用:
如果你使用一次,对于一个唯一的文件,最好是通过在其他文件之前选择它们的大小来减少工作。
如果您经常使用它(并且想快速使用),请定期在后台扫描新文件以保持哈希基础最新。检测新文件很简单。
如果你想复制所有文件,最好扫描所有内容,并使用设置策略
希望这对您有所帮助
您需要 recursively scan for files,然后,对于找到的每个文件,计算其 MD5 或其他任何内容并将该哈希值存储在 Set<...>
中,如果您只想知道 if 一个文件是一个 dupe,或者在 Map<..., File>
如果你想知道当前文件是哪个文件的副本。
对于每个文件的散列,您查看已知散列的集合以检查该特定散列值是否在其中;如果是,则您(很可能)有一个重复文件;如果不是,则将新的哈希值添加到集合中并继续处理下一个文件。
由于某些原因我不能使用MessageDigest.getInstance("MD5")
,所以我必须手动编写算法代码,我的项目是扫描重复文档(*.doc,*.txt,*.pdf) Android 设备。我的问题是,在输入算法之前我必须写什么,才能扫描 Android 设备上 MY ROOT 目录中的重复文件?没有 select 目录,当我按下按钮扫描时,进程开始, listview
显示。有人可以帮助我吗?我的项目截止日期即将到来。非常感谢。
public class MD5 {
//What must I write here, so I allow to scan for duplicate document on Android root with MD5 Hash
//MD5 MANUAL ALGORITHM CODE
}
整个过程:
您的目标是检测(并可能存储有关)重复文件。
1 然后,首先,你必须遍历目录和文件,
看到这个:
list all files from directories and subdirectories in Java
2 对于每个文件,像字节数组一样加载它
看到这个:
Reading a binary input stream into a single byte array in Java
3 然后计算您的 MD5 - 您的项目
4 并存储此信息
您可以使用 Set 来检测重复项(Set 具有独特的元素)。
Set<String> files_hash; // each String is a string representation of MD5
if (files_hash.contains(my_md5)) // you know you have it already
或一个
Map<String,String> file_and_hash; // each is file => hash
// you have to iterate to know if you have it already, or keep also a Set
MD5 的答案:
读取算法: https://en.wikipedia.org/wiki/MD5
RFC:https://www.ietf.org/rfc/rfc1321.txt
一些谷歌搜索...
这个演示文稿,一步一步 http://infohost.nmt.edu/~sfs/Students/HarleyKozushko/Presentations/MD5.pdf
或尝试复制 C(或 java)实现 ...
总体战略
要保持时间并加快处理速度,您还必须考虑函数的使用:
如果你使用一次,对于一个唯一的文件,最好是通过在其他文件之前选择它们的大小来减少工作。
如果您经常使用它(并且想快速使用),请定期在后台扫描新文件以保持哈希基础最新。检测新文件很简单。
如果你想复制所有文件,最好扫描所有内容,并使用设置策略
希望这对您有所帮助
您需要 recursively scan for files,然后,对于找到的每个文件,计算其 MD5 或其他任何内容并将该哈希值存储在 Set<...>
中,如果您只想知道 if 一个文件是一个 dupe,或者在 Map<..., File>
如果你想知道当前文件是哪个文件的副本。
对于每个文件的散列,您查看已知散列的集合以检查该特定散列值是否在其中;如果是,则您(很可能)有一个重复文件;如果不是,则将新的哈希值添加到集合中并继续处理下一个文件。