বার্তা ডাইজেস্ট (হ্যাশ) বাইট [] বাইটে [] বাইরে
একটি বার্তা হজম একটি ফাংশন হিসাবে সংজ্ঞায়িত করা হয় যা কাঁচা বাইট অ্যারে নেয় এবং একটি কাঁচা বাইট অ্যারে (ওরফে byte[]
) প্রদান করে। উদাহরণস্বরূপ SHA-1 (সিকিওর হ্যাশ অ্যালগরিদম 1) এর ডাইজেস্ট আকার 160 বিট বা 20 বাইট রয়েছে। কাঁচা বাইট অ্যারে সাধারণত হিসাবে ব্যাখ্যা করা যায় না ইউটিএফ -8 এর মতো অক্ষর এনকোডিং না, কারণ প্রতিটি ক্রমের প্রতিটি বাইট আইনী নয় যা এনকোডিং। সুতরাং এগুলিকে এর সাথে রূপান্তর করা String
:
new String(md.digest(subject), StandardCharsets.UTF_8)
কিছু অবৈধ সিক্যুয়েন্স তৈরি করতে পারে বা ইউনিকোড ম্যাপিংকে অপরিজ্ঞাত করতে কোড-পয়েন্টার থাকতে পারে :
[�a�ɹ??�%l�3~��.
বাইনারি থেকে পাঠ্য এনকোডিং
এর জন্য বাইনারি-থেকে-পাঠ্য এনকোডিং ব্যবহৃত হয়। হ্যাশ সহ, সবচেয়ে বেশি ব্যবহৃত হয় হেক্স এনকোডিং বা বেস 16 । মূলত একটি বাইট থেকে মান থাকতে পারে 0
জন্য 255
(অথবা -128
যাওয়ার 127
যার HEX উপস্থাপনা সমতূল্য সাইন ইন)0x00
- 0xFF
। সুতরাং হেক্স আউটপুটটির প্রয়োজনীয় দৈর্ঘ্য দ্বিগুণ করবে, এর অর্থ একটি 20 বাইট আউটপুট একটি 40 অক্ষর দীর্ঘ হেক্স স্ট্রিং তৈরি করবে, যেমন:
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
মনে রাখবেন এটি হেক্স এনকোডিং ব্যবহার করার প্রয়োজন নেই। আপনি বেস 64 এর মতো কিছু ব্যবহার করতে পারেন । হেক্স প্রায়শই পছন্দ করা হয় কারণ এটি মানুষের দ্বারা সহজেই পাঠযোগ্য এবং প্যাডিংয়ের প্রয়োজনীয়তা ছাড়াই নির্ধারিত আউটপুট দৈর্ঘ্য রয়েছে has
আপনি একা জেডিকে কার্যকারিতা সহ বাইট অ্যারে হেক্সে রূপান্তর করতে পারেন:
new BigInteger(1, token).toString(16)
নোট যাইহোক এটি BigInteger
প্রদত্ত বাইট অ্যারের সংখ্যা হিসাবে এবং বাইট স্ট্রিং হিসাবে নয় হিসাবে ব্যাখ্যা করবে । তার অর্থ নেতৃস্থানীয় শূন্যগুলি আউটপুট করা হবে না এবং ফলস্বরূপ স্ট্রিং 40 টি অক্ষরের চেয়ে কম হতে পারে।
এইচএক্স-এ এনকোড করতে গ্রন্থাগারগুলি ব্যবহার করা হচ্ছে
আপনি এখন স্ট্যাক ওভারফ্লো থেকে একটি অচিহ্নিত বাইট-টু-হেক্স পদ্ধতি অনুলিপি এবং পেস্ট করতে পারেন বা পেয়ারা জাতীয় বিশাল নির্ভরতা ব্যবহার করতে পারেন ।
বেশিরভাগ বাইট সম্পর্কিত সমস্যাগুলির সমাধানের জন্য আমি এই কেসগুলি পরিচালনা করার জন্য একটি ইউটিলিটি প্রয়োগ করেছি: বাইটস-জাভা (গিথুব)
আপনার বার্তা ডাইজেস্ট বাইট অ্যারে রূপান্তর করতে আপনি ঠিক করতে পারেন
String hex = Bytes.wrap(md.digest(subject)).encodeHex();
অথবা আপনি কেবল বিল্ট-ইন হ্যাশ বৈশিষ্ট্যটি ব্যবহার করতে পারেন
String hex = Bytes.from(subject).hashSha1().encodeHex();
SHA1
হাইফেন ছাড়াই, জানেন না যে এটি কোনও পার্থক্য করবে কিনা।