জাভাতে একটি ফাইলের MD5 চেকসাম প্রাপ্ত


508

আমি একটি ফাইলের MD5 চেকসাম পেতে জাভা ব্যবহার করতে চাইছি। আমি সত্যিই অবাক হয়েছিলাম তবে কোনও ফাইলের MD5 চেকসাম কীভাবে পাবেন তা দেখায় এমন কিছুই আমি খুঁজে পাচ্ছিলাম না।

এটা কিভাবে সম্পন্ন করা হয়?


সম্ভবত এটি সাহায্য করবে। আপনি অনুমানটি সন্ধান করতে পারেন তবে এটি জটিল হওয়ার কারণে আরও কাজ করতে হবে।
ওয়েইনকোলভিন

4
মনে রাখবেন যে সাম্প্রতিক গবেষণা অনুসারে "এমডি 5 কে ক্রিপ্টোগ্রাফিকভাবে ভাঙ্গা এবং আরও ব্যবহারের জন্য অনুপযুক্ত বিবেচনা করা উচিত"। en.wikipedia.org/wiki/MD5
Zakharia স্ট্যানলি

80
এমডি 5 কে এখন ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত হিসাবে বিবেচনা করা হয় না তবে এটি এখনও ফাইলের ধারাবাহিকতা যাচাই করার জন্য যথেষ্ট এবং এটি SHA এর চেয়ে দ্রুত faster
জিগি

2
এই টুইটটি চেকসামিং সম্পর্কিত একটি প্রশ্ন।
আইফেরিয়ান

ফাইলগুলিতে MD5 চেকসামের জন্য সাধারণ ব্যবহার হ'ল বিতরণকৃত ফাইলগুলির প্রতিকূল প্রতিস্থাপন এড়ানো। এটি যেখানে এটি অনিরাপদ। তবে এমন পরিস্থিতিতে যেখানে প্রতিকূল শোষণগুলি উদ্বেগ নয়, এটি পুরোপুরি উপযুক্ত।
কিথ টেলার

উত্তর:


540

একটি ইনপুট স্ট্রিম ডেকোরেটর রয়েছে, java.security.DigestInputStreamযাতে আপনি ইনপুট স্ট্রিমটি ব্যবহার করার সময় ডাইজেস্টটি গণনা করতে পারেন যেমন আপনি সাধারণত ডাটার উপর অতিরিক্ত পাস না করে would

MessageDigest md = MessageDigest.getInstance("MD5");
try (InputStream is = Files.newInputStream(Paths.get("file.txt"));
     DigestInputStream dis = new DigestInputStream(is, md)) 
{
  /* Read decorated stream (dis) to EOF as normal... */
}
byte[] digest = md.digest();

4
আমি সম্মত, ফ্লাইতে চেকসাম গণনা করার খুব মার্জিত উপায় যদি আপনি ইতিমধ্যে বাইটগুলি দিয়ে কিছু করছেন (যেমন এইচটিটিপি সংযোগ থেকে সেগুলি পড়ছেন)।
মার্ক নোকাকোভস্কি

2
@ আলফাবা আপনি এটিকে বা একটি isহিসাবে ঘোষণা করেছেন ? আপনার মতো ব্যবহার করা শব্দ , যা এই ত্রুটির কারণ হতে পারে। InputStreamFileInputStreamFileInputStream
এরিকসন

1
@ বার্বনিক্ক এটি জাভা ৮-তে সূক্ষ্মভাবে কাজ করে MethodNotFoundstandard স্ট্যান্ডার্ড জাভা থেকে ব্যতিক্রম নয়; সম্ভবত আপনি একটি সংকলক ত্রুটি সম্পর্কে কথা বলছেন? যাইহোক, যদি এটি আপনার পক্ষে কাজ করে না, এটি একটি স্থানীয় কনফিগারেশন সমস্যা, বা অন্য কোডের সাথে সমস্যা।
এরিকসন

4
@ বার্বনিক্ক আবার, এটি আপনার স্থানীয় কনফিগারেশন সমস্যা। এটি বৈধ জাভা 7 এবং জাভা 8 কোড। আপনি যদি 2006 থেকে সরঞ্জামগুলির সাথে আটকে থাকেন তবে আপনাকে মানিয়ে নিতে হবে।
এরিকসন

5
@ এরিকসন আপনি ফাইল সামগ্রীর সাহায্যে মেসেজডিজাস্ট অবজেক্টটি আপডেট করছেন না। আরটি? এই কোডটি সর্বদা একই ডাইজেস্ট প্রিন্ট করবে।
sunil

302

অ্যাপাচি কমন্স কোডেক লাইব্রেরি থেকে ডাইজেস্টটিলগুলি ব্যবহার করুন :

try (InputStream is = Files.newInputStream(Paths.get("file.zip"))) {
    String md5 = org.apache.commons.codec.digest.DigestUtils.md5Hex(is);
}

1
আমার অ্যান্ড্রয়েড কোডে আমার পক্ষে কাজ করে না আমি এই ত্রুটিটি পেয়েছি ... java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Hex.encodeHexString at or..pache.commons.codec.digest.DigestUtils.md5Hex (DigestUtils.java:215)
Jpm

@ জেপিএম অনুমান করে আপনি ডাউনলোড করেছেন এবং commons-codec.jarইতিমধ্যে আপনার ক্লাসপথে রেখেছেন ?
লিফ গ্রুয়েনউল্ড্ট 21

হ্যাঁ এবং আমি আমার অ্যান্ড্রয়েড প্রজেক্টে রফতানি করেছি..আমি কোডের মাধ্যমে পদক্ষেপ নিতে পারি এবং ক্লাসটি উত্স ফাইলগুলিতে আছে ... অদ্ভুত, অবশ্যই কিছু অ্যান্ড্রয়েড একলাইপসের সমস্যা হতে পারে।
জে.পি.এম

1
আমার একই সমস্যা ছিল, তবে এটি এই কোডটি দিয়ে স্থির করেছে - ফাইলআইপুটপ্রবাহ fis = নতুন ফাইলআইপুটপ্রবাহ (নতুন ফাইল (ফাইলপথ)); বাইট ডেটা [] = org.apache.commons.codec.digest.DigestUtils.md5 (fis); char md5Chars [] = Hex.encodeHex (ডেটা); স্ট্রিং এমডি 5 = স্ট্রিং.ভ্যালুওফ (এমডি 5 চ্যারস); `
দিমিত্রি_ এল

1
নিস! নতুন প্রকল্পগুলির জন্য আমি সবসময় নতুন নির্ভরতা যুক্ত করার আগে দুবার ভাবি কিন্তু বিদ্যমান প্রকল্পের জন্য আমাকে কেবল লাইব্রেরিটি ব্যবহার করার জন্য সেখানে আছে কিনা তা পরীক্ষা করে দেখতে হবে। +1
অস্কাররাইজ

164

রিয়েল এর জাভা-হাউ-তে মেসেজডিজ্ট ক্লাসটি ব্যবহার করার একটি উদাহরণ রয়েছে ।

সিআরসি 32 এবং এসএএএ -1 ব্যবহারের উদাহরণগুলির জন্য সেই পৃষ্ঠাটি দেখুন।

import java.io.*;
import java.security.MessageDigest;

public class MD5Checksum {

   public static byte[] createChecksum(String filename) throws Exception {
       InputStream fis =  new FileInputStream(filename);

       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);

       fis.close();
       return complete.digest();
   }

   // see this How-to for a faster way to convert
   // a byte array to a HEX string
   public static String getMD5Checksum(String filename) throws Exception {
       byte[] b = createChecksum(filename);
       String result = "";

       for (int i=0; i < b.length; i++) {
           result += Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
       }
       return result;
   }

   public static void main(String args[]) {
       try {
           System.out.println(getMD5Checksum("apache-tomcat-5.5.17.exe"));
           // output :
           //  0bb2827c5eacf570b6064e24e0e6653b
           // ref :
           //  http://www.apache.org/dist/
           //          tomcat/tomcat-5/v5.5.17/bin
           //              /apache-tomcat-5.5.17.exe.MD5
           //  0bb2827c5eacf570b6064e24e0e6653b *apache-tomcat-5.5.17.exe
       }
       catch (Exception e) {
           e.printStackTrace();
       }
   }
}

70
হ্যাঁ ... 11 বছর পরেও অনলাইনে! :-)
রিয়েলহোতো

রিয়ালের জাভা-হা-টু-র উদাহরণটি নিখুঁতভাবে কাজ করে এবং এটি কার্যকর করা সহজ ছিল।
বকোয়ারো

পঠন লুপটি একটু আনাড়ি। read()শূন্য ফিরে আসবে না, এবং do/whileএটি সত্যিই উপযুক্ত নয়।
লার্নের মারকুইস 16'15

10
@ ইজেপি আপনার সময় মতামত জন্য ধন্যবাদ
বিল করুন

বাইট [] বাফার = নতুন বাইট [1024]; আমরা কি 1024 থেকে আকারটিকে আরও অনুকূল কিছুতে পরিবর্তন করতে পারি?
জলপেশ

90

Com.google.common.hash এপিআই অফার:

  • সমস্ত হ্যাশ ফাংশনের জন্য একটি ইউনিফাইড ব্যবহারকারী-বান্ধব এপিআই
  • বীজযোগ্য 32- এবং 128-বিট বকবক এর প্রয়োগ
  • md5 (), sha1 (), sha256 (), sha512 () অ্যাডাপ্টার, এগুলির মধ্যে স্যুইচ করতে কোডের একটি মাত্র লাইন পরিবর্তন করে এবং বচসা।
  • গুডফাস্টহ্যাশ (ইন বিটস), যখন আপনি কী অ্যালগরিদম ব্যবহার করেন সেদিকে খেয়াল রাখবেন না
  • হ্যাশকোড দৃষ্টান্তের জন্য সাধারণ ইউটিলিটিস, যেমন কম্বাইনআর্ডারড / কম্বাইনআর্ডারর্ডেড

ব্যবহারকারীর গাইড ( আইও ব্যাখ্যা , হ্যাশিং ব্যাখ্যা করা ) পড়ুন।

আপনার ব্যবহারের ক্ষেত্রে Files.hash()গণনার জন্য এবং কোনও ফাইলের ডাইজেস্ট মান প্রদান করে।

যেমন ক হজম গণনা (MD5 ডাইজেস্ট পেতে SHA-1 পরিবর্তন MDD করুন)

HashCode hc = Files.asByteSource(file).hash(Hashing.sha1());
"SHA-1: " + hc.toString();

মনে রাখবেন যে তুলনায় অনেক দ্রুত , তাই ব্যবহার যদি আপনার কোনও ক্রিপ্টোগ্রাফিক সুরক্ষিত চেকসামের প্রয়োজন না হয়। এটিও নোট করুন পাসওয়ার্ড এবং যেমন সংরক্ষণের জন্য ব্যবহার করা উচিত নয় যেহেতু পাসওয়ার্ড ব্যবহারের জন্য এটি জোর করা শক্ত হওয়া সহজ , অথবা পরিবর্তে.

হ্যাশগুলির সাথে দীর্ঘমেয়াদী সুরক্ষার জন্য একটি মর্কলে স্বাক্ষর স্কিমটি সুরক্ষা যুক্ত করে এবং ইউরোপীয় কমিশন স্পনসর করে পোস্ট কোয়ান্টাম ক্রিপ্টোগ্রাফি স্টাডি গ্রুপ কোয়ান্টাম কম্পিউটারের ( রেফ ) বিরুদ্ধে দীর্ঘমেয়াদী সুরক্ষার জন্য এই ক্রিপ্টোগ্রাফি ব্যবহারের পরামর্শ দিয়েছে ।

মনে রাখবেন যে অন্যদের তুলনায় এর সংঘর্ষের হার বেশি।


উপরে উল্লিখিত ফাইল.হ্যাশের কোন অংশটি ফাইল.হ্যাশকে কভার করে না?
ওলুই

2
Files.hash(): যেমন অবচিত চিহ্নিত করা হয়, প্রস্তাবিত উপায়Files.asByteSource(file).hash(Hashing.sha1())
erkfel

1
এবং জানুয়ারী 2018 হিসাবে অবচয় Hashing.sha1()হিসাবে চিহ্নিত করা হয়েছে। Hashing.sha256()পরিবর্তে ফাংশন সুপারিশ করা হয়। উত্স
ম্যাজিকলিজেন্ড

58

নিও 2 (জাভা 7+) ব্যবহার করে এবং কোনও বাহ্যিক লাইব্রেরি নেই:

byte[] b = Files.readAllBytes(Paths.get("/path/to/file"));
byte[] hash = MessageDigest.getInstance("MD5").digest(b);

প্রত্যাশিত চেকসামের সাথে ফলাফলটির তুলনা করতে:

String expected = "2252290BC44BEAD16AA1BF89948472E8";
String actual = DatatypeConverter.printHexBinary(hash);
System.out.println(expected.equalsIgnoreCase(actual) ? "MATCH" : "NO MATCH");

@ আরশ হ্যাঁ একেবারে - ধন্যবাদ আমি জেডিকে ফাইল ক্লাস এবং পেয়ারা মিশ্রিত করেছি।
Assylias

আমি এই সমাধানটি এরিকসনের চেয়ে বেশি পছন্দ করি যেহেতু এটি খাঁটি ফাংশনাল স্টাইল প্রোগ্রামিং ব্যবহার করতে বিকল্পগুলির সাথে মোড়ানো যায়
গ্যাব্রিয়েল হার্নান্দেজ

2
একটি বড় ফাইলের জন্য এটি প্রচুর স্মৃতি ব্যবহার করবে যেহেতু পুরো ফাইলটি পড়া হয় এবং তারপরে খণ্ডগুলি পড়ার পরিবর্তে ডাইজেস্টকে খাওয়ানো হয় এবং সেগুলি পড়ার সাথে সাথে "হজম" করে।
বার্নি

39

পেয়ারা এখন একটি নতুন, ধারাবাহিক হ্যাশিং এপিআই সরবরাহ করে যা জেডিকে সরবরাহ করা বিভিন্ন হ্যাশিং এপিআইয়ের তুলনায় অনেক বেশি ব্যবহারকারী-বান্ধব। হ্যাশিং ব্যাখ্যা করা দেখুন । একটি ফাইলের জন্য, আপনি এমডি 5 যোগ, CRC32 (সংস্করণ 14.0+ সহ) বা অন্যান্য অনেকগুলি হ্যাশ সহজেই পেতে পারেন:

HashCode md5 = Files.hash(file, Hashing.md5());
byte[] md5Bytes = md5.asBytes();
String md5Hex = md5.toString();

HashCode crc32 = Files.hash(file, Hashing.crc32());
int crc32Int = crc32.asInt();

// the Checksum API returns a long, but it's padded with 0s for 32-bit CRC
// this is the value you would get if using that API directly
long checksumResult = crc32.padToLong();

32

ঠিক আছে. আমি যোগ করতে হবে। যাদের ইতিমধ্যে স্প্রিং এবং অ্যাপাচি কমন্স নির্ভরতা রয়েছে বা এটি যুক্ত করার পরিকল্পনা করছেন তাদের জন্য একটি লাইন বাস্তবায়ন:

DigestUtils.md5DigestAsHex(FileUtils.readFileToByteArray(file))

এবং অ্যাপাচি কমন্স কেবলমাত্র বিকল্প (ক্রেডিট @ ডুলেশি):

DigestUtils.md5Hex(FileUtils.readFileToByteArray(file))

আশা করি এটি কাউকে সাহায্য করবে।


1
এটিDigestUtils.md5Hex(FileUtils.readFileToByteArray(file))
দুলেশি

ডেভিড অন্টার কমন্স ভিত্তিক সমাধানটি আরও ভাল কারণ এটি একটি সম্পূর্ণ ফাইল মেমোরিতে পড়ে না।
ফ্রান মারজোয়া

জন্য অন্তত Spring 5 আপনার আছে DigestUtils.md5Digest(InputStream inputStream)MD5 ডাইজেস্ট এবং নিরূপণ করা DigestUtils.md5DigestAsHex(InputStream inputStream)মেমরিতে একটি সম্পূর্ণ ফাইলটি পড়ার ছাড়া MD5 ডাইজেস্ট পদ্ধতির হেক্সাডেসিমেল স্ট্রিং উপস্থাপনা জন্য।
মাইক শুনিউ

24

জাভা using ব্যবহার করে কোনও তৃতীয় পক্ষের লাইব্রেরি নেই এমন একটি সহজ পদ্ধতি

String path = "your complete file path";
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(Files.readAllBytes(Paths.get(path)));
byte[] digest = md.digest();

আপনার যদি এই বাইট অ্যারে প্রিন্ট করতে হয়। নীচের হিসাবে ব্যবহার করুন

System.out.println(Arrays.toString(digest));

আপনার যদি ডাইজেস্টের বাইরে হেক্স স্ট্রিং দরকার হয়। নীচের হিসাবে ব্যবহার করুন

String digestInHex = DatatypeConverter.printHexBinary(digest).toUpperCase();
System.out.println(digestInHex);

যেখানে ডেটাটাইপ কনভার্টরটি জাভ্যাক্স.এক্সএমএল.বাইন্ড।ড্যাট্যাটাইপ কনভার্টার


কেন toUpperCase?
এজ কেসবার্গ

@edgecaseberg যখন কনসোলে এটা মুদ্রণ শুধু হেক্স স্ট্রিং বর্ণন ভাল জন্য
সুনীল

আমি খুঁজে পেয়েছি যে টুআপারকেস () এর পরিবর্তে আমাকে পাওয়ারওয়ার () ব্যবহার করতে হবে।
জাঁকজমকপূর্ণ

13

আমাকে সম্প্রতি একটি গতিশীল স্ট্রিংয়ের জন্য এটি MessageDigestকরতে হয়েছিল, হ্যাশটিকে বিভিন্ন উপায়ে উপস্থাপন করতে পারে। আপনি যেমন md5sum কমান্ডের সাথে পাবেন ফাইলটির স্বাক্ষর পেতে আমাকে এই জাতীয় কিছু করতে হয়েছিল:

try {
   String s = "TEST STRING";
   MessageDigest md5 = MessageDigest.getInstance("MD5");
   md5.update(s.getBytes(),0,s.length());
   String signature = new BigInteger(1,md5.digest()).toString(16);
   System.out.println("Signature: "+signature);

} catch (final NoSuchAlgorithmException e) {
   e.printStackTrace();
}

এটি কোনও ফাইলের জন্য বিশেষভাবে কীভাবে করা যায় সে সম্পর্কে আপনার প্রশ্নের স্পষ্টতই উত্তর দেয় না, উপরের উত্তরটি শান্তর সাথে সুন্দরভাবে আচরণ করে। বেশিরভাগ অ্যাপ্লিকেশানের এটির মতো প্রদর্শন করার জন্য যোগফল পাওয়ার জন্য আমি অনেক সময় ব্যয় করেছি এবং ভেবেছিলাম আপনিও একই সমস্যায় পড়তে পারেন।


স্বাক্ষর হেক্সাডেসিমাল ফর্ম্যাটে ডাইজেস্ট। আমিও যেখানে হেক্সাডেসিমাল উপস্থাপনা কাজ করেছি সেখানে আপনি যেমন বলেছেন যে অন্যান্য উপস্থাপনা কাজ করে না। এই পর্যন্ত স্থাপন করার জন্য আপনাকে ধন্যবাদ।
amit

11
public static void main(String[] args) throws Exception {
    MessageDigest md = MessageDigest.getInstance("MD5");
    FileInputStream fis = new FileInputStream("c:\\apache\\cxf.jar");

    byte[] dataBytes = new byte[1024];

    int nread = 0;
    while ((nread = fis.read(dataBytes)) != -1) {
        md.update(dataBytes, 0, nread);
    };
    byte[] mdbytes = md.digest();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < mdbytes.length; i++) {
        sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
    }
    System.out.println("Digest(in hex format):: " + sb.toString());
}

অথবা আপনি আরও তথ্য পেতে পারেন http://www.asjava.com/core-java/java-md5-example/



9

আমরা আগের পোস্টে উপরের কোডটির সাথে সাদৃশ্যযুক্ত এমন কোড ব্যবহার করছিলাম

...
String signature = new BigInteger(1,md5.digest()).toString(16);
...

তবে, BigInteger.toString()এখানে ব্যবহারের জন্য নজর রাখুন , কারণ এটি নেতৃস্থানীয় শূন্যগুলি কেটে ফেলবে ... (উদাহরণস্বরূপ, চেষ্টা করুন s = "27", চেকসামটি হওয়া উচিত "02e74f10e0327ad868d138f2b4fdd6f0")

আমি অ্যাপাচি কমন্স কোডেক ব্যবহারের পরামর্শটিকে দ্বিতীয় করেছিলাম, আমি এটির সাথে আমাদের নিজস্ব কোডটি প্রতিস্থাপন করেছি।


1
বাহ, আমি এমন একটি বিষয় সন্ধান করছিলাম যেখানে MD5 স্টাফ সমস্ত কিছুর জন্য নিখুঁতভাবে কাজ করে, কেবল একটি ফাইল বাদ দিয়ে আমাদের কেবলমাত্র 31 হেক্স ডিজিটের আউটপুট প্রদান করা হত এবং এমডি 5 চেকসামগুলি ব্যর্থ হচ্ছিল। শীর্ষস্থানীয় 0 এর কাটাটি একটি বিশাল ব্যথা ... আপনার নোটের জন্য ধন্যবাদ।
মাইক 18

8
public static String MD5Hash(String toHash) throws RuntimeException {
   try{
       return String.format("%032x", // produces lower case 32 char wide hexa left-padded with 0
      new BigInteger(1, // handles large POSITIVE numbers 
           MessageDigest.getInstance("MD5").digest(toHash.getBytes())));
   }
   catch (NoSuchAlgorithmException e) {
      // do whatever seems relevant
   }
}

8

খুব দ্রুত এবং পরিষ্কার জাভা-পদ্ধতি যা বাহ্যিক লাইব্রেরিতে নির্ভর করে না:

(এমডি 5 কে কেবল SHA-1, SHA-256, SHA-384 বা SHA-512 এর সাথে প্রতিস্থাপন করুন যদি আপনি এটি চান)

public String calcMD5() throws Exception{
        byte[] buffer = new byte[8192];
        MessageDigest md = MessageDigest.getInstance("MD5");

        DigestInputStream dis = new DigestInputStream(new FileInputStream(new File("Path to file")), md);
        try {
            while (dis.read(buffer) != -1);
        }finally{
            dis.close();
        }

        byte[] bytes = md.digest();

        // bytesToHex-method
        char[] hexChars = new char[bytes.length * 2];
        for ( int j = 0; j < bytes.length; j++ ) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = hexArray[v >>> 4];
            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
        }

        return new String(hexChars);
}


6

স্ট্যান্ডার্ড জাভা রানটাইম এনভায়রনমেন্ট উপায় :

public String checksum(File file) {
  try {
    InputStream fin = new FileInputStream(file);
    java.security.MessageDigest md5er =
        MessageDigest.getInstance("MD5");
    byte[] buffer = new byte[1024];
    int read;
    do {
      read = fin.read(buffer);
      if (read > 0)
        md5er.update(buffer, 0, read);
    } while (read != -1);
    fin.close();
    byte[] digest = md5er.digest();
    if (digest == null)
      return null;
    String strDigest = "0x";
    for (int i = 0; i < digest.length; i++) {
      strDigest += Integer.toString((digest[i] & 0xff) 
                + 0x100, 16).substring(1).toUpperCase();
    }
    return strDigest;
  } catch (Exception e) {
    return null;
  }
}

ফলাফলটি লিনাক্স এমডি 5সাম ইউটিলিটির সমান।


6

এখানে একটি সাধারণ ফাংশন যা সুনীলের কোডের চারপাশে মোড়ানো থাকে যাতে এটি কোনও ফাইলকে প্যারামিটার হিসাবে নেয়। ফাংশনটির জন্য কোনও বাহ্যিক গ্রন্থাগার প্রয়োজন হয় না, তবে এটি জাভা 7 প্রয়োজন।

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.xml.bind.DatatypeConverter;

public class Checksum {

    /**
     * Generates an MD5 checksum as a String.
     * @param file The file that is being checksummed.
     * @return Hex string of the checksum value.
     * @throws NoSuchAlgorithmException
     * @throws IOException
     */
    public static String generate(File file) throws NoSuchAlgorithmException,IOException {

        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.update(Files.readAllBytes(file.toPath()));
        byte[] hash = messageDigest.digest();

        return DatatypeConverter.printHexBinary(hash).toUpperCase();
    }

    public static void main(String argv[]) throws NoSuchAlgorithmException, IOException {
        File file = new File("/Users/foo.bar/Documents/file.jar");          
        String hex = Checksum.generate(file);
        System.out.printf("hex=%s\n", hex);            
    }


}

উদাহরণ আউটপুট:

hex=B117DD0C3CBBD009AC4EF65B6D75C97B

3

আপনি যদি এএনটি তৈরিতে ব্যবহার করেন তবে এটি মৃত-সহজ। আপনার বিল্ড.এক্সএমএলে নিম্নলিখিতটি যুক্ত করুন:

<checksum file="${jarFile}" todir="${toDir}"/>

জারফাইল যেখানে জার যেখানে আপনি এমডি 5 এর বিপরীতে তৈরি করতে চান এবং টুডির সেই ডিরেক্টরিটি যা আপনি এমডি 5 ফাইলটি রাখতে চান।

আরও তথ্য এখানে।


3

গুগল পেয়ারা একটি নতুন এপিআই সরবরাহ করে। নীচের একটি সন্ধান করুন:

public static HashCode hash(File file,
            HashFunction hashFunction)
                     throws IOException

Computes the hash code of the file using hashFunction.

Parameters:
    file - the file to read
    hashFunction - the hash function to use to hash the data
Returns:
    the HashCode of all of the bytes in the file
Throws:
    IOException - if an I/O error occurs
Since:
    12.0

3

এখানে InputStream.transferTo()জাভা 9 এবং OutputStream.nullOutputStream()জাভা 11 থেকে একটি কার্যকর প্রকরণ রয়েছে যা এর জন্য কোনও বাহ্যিক গ্রন্থাগার প্রয়োজন নেই এবং পুরো ফাইলটিকে মেমরিতে লোড করার প্রয়োজন নেই।

public static String hashFile(String algorithm, File f) throws IOException, NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance(algorithm);

    try(BufferedInputStream in = new BufferedInputStream((new FileInputStream(f)));
        DigestOutputStream out = new DigestOutputStream(OutputStream.nullOutputStream(), md)) {
        in.transferTo(out);
    }

    String fx = "%0" + (md.getDigestLength()*2) + "x";
    return String.format(fx, new BigInteger(1, md.digest()));
}

এবং

hashFile("SHA-512", Path.of("src", "test", "resources", "some.txt").toFile());

আয়

"e30fa2784ba15be37833d569280e2163c6f106506dfb9b07dde67a24bfb90da65c661110cf2c5c6f71185754ee5ae3fd83a5465c92f72abd888b03187229da29"

2
public static String getMd5OfFile(String filePath)
{
    String returnVal = "";
    try 
    {
        InputStream   input   = new FileInputStream(filePath); 
        byte[]        buffer  = new byte[1024];
        MessageDigest md5Hash = MessageDigest.getInstance("MD5");
        int           numRead = 0;
        while (numRead != -1)
        {
            numRead = input.read(buffer);
            if (numRead > 0)
            {
                md5Hash.update(buffer, 0, numRead);
            }
        }
        input.close();

        byte [] md5Bytes = md5Hash.digest();
        for (int i=0; i < md5Bytes.length; i++)
        {
            returnVal += Integer.toString( ( md5Bytes[i] & 0xff ) + 0x100, 16).substring( 1 );
        }
    } 
    catch(Throwable t) {t.printStackTrace();}
    return returnVal.toUpperCase();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.