① 如何用java或者c#寫個掃描整個文件夾及子文件夾,驗證多個文件的md5值,並將md5值重復但不同
java的,我已經測試可以使用。
但是單個文件很大的話可能算md5會比較慢
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
importjava.util.ArrayList;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.math.BigInteger;
importjava.nio.MappedByteBuffer;
importjava.nio.channels.FileChannel;
publicclassMain
{
ArrayList<String>md5List=newArrayList<String>();
publicStringgetMd5(Filefile){
Stringvalue=null;
FileInputStreamin=null;
try{
in=newFileInputStream(file);
MappedByteBufferbyteBuffer=in.getChannel().map(FileChannel.MapMode.READ_ONLY,0,file.length());
MessageDigestmd5=MessageDigest.getInstance("MD5");
md5.update(byteBuffer);
BigIntegerbi=newBigInteger(1,md5.digest());
value=bi.toString(16);
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
if(null!=in){
try{
in.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
returnvalue;
}
publicvoidrun(Filefile){
if(file!=null){
if(file.isDirectory()){
Filef[]=file.listFiles();
if(f!=null){
for(inti=0;i<f.length;i++)
run(f[i]);
}
}else{
Stringmd5=getMd5(file);
if(md5List.contains(md5)){
System.out.println(file.toString());
file.delete();
}else{
md5List.add(md5);
}
}
}
}
publicstaticvoidmain(Stringargs[]){
Mainm=newMain();
Stringpath="D:\test";
m.run(newFile(path));
}
}
② Java,如何獲取文件的MD5值
package cdm;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import org.apache.commons.codec.digest.*;
import org.apache.commons.io.IOUtils;
public class testMD5 {
public static String getMd5ByFile(File file) throws FileNotFoundException {
String value = null;
FileInputStream in = new FileInputStream(file);
try {
MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(byteBuffer);
BigInteger bi = new BigInteger(1, md5.digest());
value = bi.toString(16);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return value;
}
public static void main(String[] args) throws IOException {
String path="E:\文件.zip";
String v = getMd5ByFile(new File(path));
System.out.println("MD5:"+v.toUpperCase());
FileInputStream fis= new FileInputStream(path);
String md5 = DigestUtils.md5Hex(IOUtils.toByteArray(fis));
IOUtils.closeQuietly(fis);
System.out.println("MD5:"+md5);
//System.out.println("MD5:"+DigestUtils.md5Hex("WANGQIUYUN"));
}
}
③ java文件md5值 什麼意思
MD5是常用的一種加密方式,原數據加過加密演算法後的得到的數據就是MD5值
用戶的密碼很多是以MD5值(或類似的其它演算法)的方式保存的,這樣即使資料庫被侵入,也不能直接得到用戶的原始密碼
④ Java計算md5時欄位格式有影響嗎
Java計算MD5時,欄位格式會對結果產生影響。具體的影響取決於MD5演算法本身。
MD5演算法是將任何長度的「消息」作為輸入,經過處理後生成一個128位長度的「消息摘要」。因此,笑兄「消息」中的任何細微差別都會導致計算MD5的結果發生顯著變化。
在Java中,可以通過java.security.MessageDigest類計算MD5。該類的update()方法可用於添加數據到枝笑MessageDigest對象以進一步處理。
因此,如果在計算猛升含MD5之前更改了數據的格式(例如,更改大小寫、添加空格、更改編碼等),則計算出的MD5值將是不同的。因此,確保輸入數據的格式是與目標MD5值相同的是很關鍵的。
⑤ Java MD5如何解密
MD5 不能解密, MD5的破解方式就是 把不同的字元串按MD5加密 然後對比加密後的結果是不是一樣. 在線MD5解密 也是這樣的原理.
⑥ java多個文件怎麼生成一個md5
這里定義了一些基本的變數與靜態對象,並指定採用的方式是「md5「,下張圖為定義了一個方法,方法的參數是接收一個文件File對象,並且返回該文件生成的」md5「值。
這里定義了一個轉化方法,把文件或文件流以位元組的方式進行轉換,使之生成唯一的md5,此方法間接的應用到了md5的生成中。
這里主要定義了一個根據提供的文件流輸入流InputStream進行生成md5的值,如上幾幅圖中的代碼加在一起就是完整的文件或文件流的md5值生成方法。
4
最後一張圖片為最終生成後的效果,文件上傳的時候可以先生成md5的值後到資料庫中進行查找,如果找到了就說明相同的文件已經存在,那麼就不應該再保存了,否則會出現相同的冗餘文件。
⑦ java比較2個文件是否是相同的文件,是一個一個位元組比較還是計算MD5比較好啊
不同內容得出相同MD5值,雖然概率低,但總是不放心。如果在已知文件編碼范圍的條件下,找到MD5絕對區分長度范圍(即:該范圍內取樣內容的MD5相同的,內容保證相同;絕不存在不同內容得出相同MD5值的現象),那麼,可按合理的長度分片、按一定順序遍歷整個文件(屬性信息、頭部、尾部、同步隨機點、其他),比較MD5,一旦有異立即判定文件不同,終止比較。這種分片取樣比較MD5的思路可能快於逐位元組比較也絕對可信
要確保 100%正確就必須校驗全文,通過以上思路來比較,即是。
(註:
其他據說相對於MD5來講不易碰撞(即不同內容得出相同MD5值的概率可能更低)的演算法推薦:起碼 SHA1 ,最好 SHA256、 SHA512、MD5+CRC32、HMAC,或者幾種不同類型演算法的同步進行。
在精通演算法的情況下,將這里推薦的演算法取代上文中提到的MD5來考量,能擴大絕對區分長度范圍,可能更方便更快的比較。
但是又有這樣的考慮:逐位元組比較的演算法最簡單,演算法弄復雜了反而會增加額余的時間;逐位元組比較的演算法也可以放到上文中來考量,進行同步取樣和各種遍歷的順序與方式,說不定,在保證100%的可信度的條件下,逐字比較反而最快呢?
我覺得時間的耗費關鍵處在於,所有的演算法,都要將兩個答氏衡位於不同區域或載體的文件的同位區域收集到一起進行比較,這個收集花費時間Ta(i),與取樣長度、存儲區域或載體等相關;{如果要將文件取很大一部或全部讀入內存,然後再逐一集中核禪比較,則會減小以上的Ta(i),而增加一個額外讀入的時間Tc(i)*次數M(i)}。比較的次數大致為N(i);而如果在一個文件中順序讀取一清做個區域並且計算它的某個整體評定值,這個花費的時間為Tb(i),與取樣長度、計算程序、設備性能等相關。
總體的比較時間大致是Ta(i)*N(i)*Tb(i)+{Tc(i)*M(i)}
逐位元組比較,其中Tb(i)、Ta(i)都是最短的,但是N(i)最大,
總之,可以設計不同的演算法,通過實際環境和文件的檢測,來決定採用何種演算法。
)
外一則:
兩個取樣內容, MD5等演算法的計算值 不同,則內容一定不同; 計算值相同,則 內容可能相同,但可能性是否達到100%,內容相同的概率是多少,根據編碼范圍、演算法來確定。如果是比較一個文件和許多其他文件是否相同,並且提前知道其他文件的 MD5 值,可先比較 MD5 值可以大大提高文件比較的速度。
⑧ java如何算md5碼
可以利用JDK自帶的MD5來加密。
publicclassMD5Util{
publicfinalstaticStringMD5(Strings){
charhexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
try{
byte[]btInput=s.getBytes();
//獲得MD5摘要演算法的MessageDigest對象
MessageDigestmdInst=MessageDigest.getInstance("MD5");
//使用指定的位元組更新摘要
mdInst.update(btInput);
//獲得密文
byte[]md=mdInst.digest();
//把密文轉換成十六進制的字元串形式
intj=md.length;
charstr[]=newchar[j*2];
intk=0;
for(inti=0;i<j;i++){
bytebyte0=md[i];
str[k++]=hexDigits[byte0>>>4&0xf];
str[k++]=hexDigits[byte0&0xf];
}
returnnewString(str);
}catch(Exceptione){
e.printStackTrace();
returnnull;
}
}
publicstaticvoidmain(String[]args){
System.out.println(MD5Util.MD5("20121221"));
System.out.println(MD5Util.MD5("加密"));
}
}
⑨ 如何用Java判斷兩個文件內容是否相同
如果你維護這些文件列表,並且後期會不定期進行比較,也就是確定一個文件有多次被比較的機會。可以計算這些文件的MD5並緩存起來,後期直接用MD5進行比較。
如果只是臨時性的隨機選兩個文件進薯碰行比較,可以先比較文件伍雹大小,如果文件大小不同就說明文件內容不相同。如果大小相等的話,可以打開這兩個文件的輸入流,位元組逐一比較,如果中間有不相等的位元組就說明兩個文件不相等,然後直接退出比較,需要注意的是文件流要緩沖(BufferedInputStream)。
之所以不推薦MD5是因為MD5也需要根據文件全部內容計算散列值,可是實際上中途發現有一個位元組不相同就可以判定這兩個文件是不同的,根本沒必要去讀取文件的全部內容。
//in1,
in2為兩個文件的輸入流,數橘談最後注意流的關閉
int
c;
while
((c
=
in1.read())
!=
-1)
{
if
(in2.read()
!=
c)
return
false;
}
return
true;
⑩ JAVA獲取資料的MD5碼,比較兩個文件是否相同怎麼解決
資料庫添加成MD5數據,頁面輸入數據,到後台嫌賣業務處理時候,獲取該數據,把數絕斗據用MD5編輯一下,改完的數據跟資料庫比較就並者磨相同了