কেন XOR হ্যাশগুলি একত্রিত করার ডিফল্ট উপায়?


145

বলুন আপনার কাছে দুটি হ্যাশ রয়েছে H(A)এবং H(B)আপনি সেগুলি একত্রিত করতে চান। আমি পড়েছি যে দুটি হ্যাশ একত্রিত করার একটি ভাল উপায় XORতাদের কাছে, যেমন XOR( H(A), H(B) )

আমি খুঁজে পেয়েছি সেরা ব্যাখ্যা এখানে এই হ্যাশ ফাংশন নির্দেশিকাগুলি সংক্ষেপে স্পর্শ করা হয় :

মোটামুটি এলোমেলো বিতরণের সাথে মোটামুটি এলোমেলো বিতরণের ফলাফলের সাথে দুটি সংখ্যার এক্সওরিং করা হয় তবে এটি এখন দুটি মানের উপর নির্ভর করে।
...
* দুটি সংখ্যার একত্রিত করতে প্রতিটি বিটে, দুটি বিট সমান হলে 0 0 আউটপুট হয়, অন্যথায় একটি 1. অন্য কথায়, সংমিশ্রণের 50% এ, 1 আউটপুট হবে। সুতরাং দুটি ইনপুট বিট যদি প্রতিটি 0 বা 1 হওয়ার প্রায় 50-50 সম্ভাবনা থাকে তবে আউটপুটটিও বিট হবে।

XH হ্যাশ ফাংশনগুলি সংযুক্ত করার জন্য ডিআরএল অপারেশন হওয়া উচিত কেন এর পিছনে অন্তর্দৃষ্টি এবং / বা গণিত ব্যাখ্যা করতে পারেন (ওআর বা এ্যান্ড ইত্যাদি না)?


20
আমার মনে হয় আপনি সবেমাত্র করেছেন;)
ম্যাসা

22
নোট করুন যে XOR আপনি "সংমিশ্রণ" এ যা চান তার উপর নির্ভর করে হ্যাশগুলি "সংযুক্ত" করার "ভাল" উপায় বা নাও হতে পারে। এক্সওআরটি পরিবর্তনীয়: এক্সওআর (এইচ (এ), এইচ (বি)) এক্সওআর (এইচ (বি), এইচ (এ)) এর সমান। এর অর্থ হল যে XOR মানগুলির ক্রমযুক্ত ক্রমের এক ধরণের হ্যাশ তৈরির সঠিক উপায় নয়, কারণ এটি অর্ডারটি ক্যাপচার করে না।
থমাস পর্নিন

6
অর্ডার (উপরে মন্তব্য) ইস্যু ছাড়াও, সমান মানগুলির সাথে সমস্যা আছে। এক্সওআর (এইচ (1), এইচ (1)) = 0 (যে কোনও ফাংশনের জন্য এইচ), এক্সওআর (এইচ (2), এইচ (2)) = 0 এবং আরও। যে কোনও এন এর জন্য: এক্সওআর (এইচ (এন), এইচ (এন)) = 0। সমান মানগুলি আসল অ্যাপ্লিকেশনগুলিতে প্রায়শই ঘটে থাকে, এর অর্থ XOR এর ফলাফল 0 বার বার ভাল হ্যাশ হিসাবে বিবেচিত হবে।
আন্দ্রেই গ্যালাতিন

মানগুলির ক্রমবিন্যাসের জন্য আপনি কী ব্যবহার করেন? ধরা যাক আমি টাইমস্ট্যাম্প বা সূচকের একটি হ্যাশ তৈরি করতে চাই। (এমএসবি এলএসবির চেয়ে কম গুরুত্বপূর্ণ)। দুঃখিত, যদি এই থ্রেডটি 1 বছরের পুরানো হয়।
অ্যালেক্সিস

উত্তর:


120

অভিন্ন র্যান্ডম (1-বিট) ইনপুট ধরে নেওয়া, এবং ফাংশন আউটপুট সম্ভাব্যতা বিতরণ 75% 0এবং 25% 1। বিপরীতে, OR 25% 0এবং 75% 1

XOR ফাংশন 50% 0এবং 50% 1, সুতরাং অভিন্ন সম্ভাব্যতা বিতরণের সংমিশ্রনের জন্য এটি ভাল।

সত্যের টেবিলগুলি লিখে এটি দেখা যায়:

 a | b | a AND b
---+---+--------
 0 | 0 |    0
 0 | 1 |    0
 1 | 0 |    0
 1 | 1 |    1

 a | b | a OR b
---+---+--------
 0 | 0 |    0
 0 | 1 |    1
 1 | 0 |    1
 1 | 1 |    1

 a | b | a XOR b
---+---+--------
 0 | 0 |    0
 0 | 1 |    1
 1 | 0 |    1
 1 | 1 |    0

অনুশীলন: দুটি 1-বিট ইনপুটগুলির কতগুলি যৌক্তিক ফাংশন aএবং bএই অভিন্ন আউটপুট বিতরণ আছে? আপনার প্রশ্নের বর্ণিত উদ্দেশ্যটির জন্য কেন এক্সওর সবচেয়ে উপযুক্ত?


24
অনুশীলনের জবাব: ১ possible টি সম্ভাব্য ভিন্ন ভিন্ন একটি XXX বি অপারেশন থেকে (0, a & b, a > b, a, a < b, b, a % b, a | b, !a & !b, a == b, !b, a >= b, !a, a <= b, !a | !b, 1), নিম্নলিখিতগুলির 0 এবং 1 এর 50% -50% বন্টন রয়েছে, ধরে নেওয়া হয়েছে যে a এবং b এর 0 এবং 1s এর 50% -50% বিতরণ রয়েছে: a, b, !a, !b, a % b, a == bঅর্থাৎ বিপরীতে এক্সওআর (ইকুইআইভি) এর পাশাপাশি ব্যবহার করা যেতে পারে ...
ম্যাসা

7
গ্রেগ, এটি একটি দুর্দান্ত উত্তর। আমি আপনার মূল উত্তরটি দেখার পরে আমার নিজের সত্যের টেবিলগুলি লেখার পরে হালকা বাল্বটি আমার পক্ষে চলে গেল। বিতরণ বজায় রাখার জন্য কীভাবে 6 টি উপযুক্ত অপারেশন রয়েছে সে সম্পর্কে আমি @ মাসার জবাব বিবেচনা করেছি এবং যখন a, b, !a, !bতাদের নিজস্ব ইনপুটগুলির মতো একই বিতরণ হবে তখন আপনি অন্যান্য ইনপুটটির এনট্রপি হারাবেন। এটি হ'ল হ্যাশগুলির সংমিশ্রণের উদ্দেশ্যে এক্সওআর সবচেয়ে উপযুক্ত কারণ আমরা ক এবং খ উভয় থেকেই এনট্রপি ক্যাপচার করতে চাই।
নাট মারে

1
এখানে একটি কাগজটি ব্যাখ্যা করেছে যে হ্যাশগুলি সুরক্ষিতভাবে সংযুক্ত করা যেখানে প্রতিটি ফাংশন কেবল একবার কল করা হয় প্রতিটি হ্যাশ মানের বিটের সংখ্যার তুলনায় কম বিট আউটপুট ছাড়া সম্ভব নয় is এটি প্রস্তাব দেয় যে এই উত্তরটি সঠিক নয়।
ট্যামস সেজেলি

3
@ মাসা আমি এক্সওআর এর জন্য% ব্যবহৃত বা সমান নয় কখনও দেখিনি।
বুগ

7
ইয়াক্ক যেমন উল্লেখ করেছেন , এক্সওআর বিপজ্জনক হতে পারে কারণ এটি অভিন্ন মানের জন্য শূন্য উত্পাদন করে। এর অর্থ (a,a)এবং (b,b)উভয়ই শূন্য উত্পাদন করে, যা অনেকগুলি (বেশিরভাগ?) ক্ষেত্রে হ্যাশ-ভিত্তিক ডেটা স্ট্রাকচারগুলিতে সংঘর্ষের সম্ভাবনা ব্যাপকভাবে বৃদ্ধি করে।
ড্র নোকস

170

xorহ্যাশিং ব্যবহার করার জন্য একটি বিপজ্জনক ডিফল্ট ফাংশন। এটি এর চেয়ে ভাল andএবং এটি বেশি orকিছু বলে না।

xorপ্রতিসম হয়, তাই উপাদানগুলির ক্রম নষ্ট হয়। সুতরাং "bad"হ্যাশ হিসাবে একই একত্রিত হবে "dab"

xor শূন্যের সাথে জোড়াবিশিষ্ট অভিন্ন মানচিত্রের মানচিত্র, এবং আপনার "সাধারণ" মানগুলি শূন্যে ম্যাপ করা উচিত:

সুতরাং (a,a)0-তে ম্যাপযুক্ত হয় এবং 0 (b,b)তে ম্যাপও হয়ে যায় such কারণ এ জাতীয় জুড়ি প্রায় সবসময়ই এলোমেলোভাবে বোঝার চেয়ে বেশি সাধারণ, আপনি যতটা সম্ভব তার চেয়ে শূন্যে অনেকগুলি সংঘর্ষের সাথে শেষ করেন।

এই দুটি সমস্যা সহ, xorএকটি হ্যাশ সংযোগকারী হিসাবে শেষ হয় যা পৃষ্ঠের অর্ধেক শালীন দেখায়, তবে আরও তদন্তের পরে নয়।

আধুনিক হার্ডওয়্যারটিতে সাধারণত প্রায় দ্রুত গতি যুক্ত করা xor(এটি সম্ভবত এটি আরও বেশি শক্তি ব্যবহার করে, স্বীকারোক্তি দিয়ে)। যুক্ত করার সত্য সারণীটি xorপ্রশ্নের বিটের মতো, তবে উভয় মান 1 হলে এটি পরবর্তী বিটকে কিছুটা প্রেরণ করে। এর অর্থ এটি কম তথ্য মুছে দেয়।

সুতরাং যে hash(a) + hash(b)তুলনায় ভাল , ফলাফল 0 পরিবর্তে হয়।hash(a) xor hash(b)a==bhash(a)<<1

এটি সমান্তরাল থেকে যায়; সুতরাং "bad"এবং "dab"একই ফলাফল পাওয়া একটি সমস্যা থেকে যায়। একটি ব্যয়বহুল ব্যয়ের জন্য আমরা এই প্রতিসাম্যতা ভাঙ্গতে পারি:

hash(a)<<1 + hash(a) + hash(b)

ওরফে hash(a)*3 + hash(b)। ( hash(a)একবারে গণনা করা এবং সংরক্ষণের পরামর্শ দেওয়া হয় যদি আপনি শিফট সমাধানটি ব্যবহার করেন)। পরিবর্তে কোন বিজোড় ধ্রুবক 3bijectively একটি "ম্যাপ করবে k, নিজেই -বিট" স্বাক্ষরবিহীন পূর্ণসংখ্যা স্বাক্ষরবিহীন পূর্ণসংখ্যার অনুমতি যেমন গণিত মডিউল হয় 2^kকিছু জন্য k, এবং যে কোনো বিজোড় ধ্রুবক অপেক্ষাকৃত প্রধানমন্ত্রীর হয় 2^k

এমনকি কল্পিত সংস্করণের জন্য আমরা পরীক্ষা করতে পারি boost::hash_combine, যা কার্যকরভাবে:

size_t hash_combine( size_t lhs, size_t rhs ) {
  lhs ^= rhs + 0x9e3779b9 + (lhs << 6) + (lhs >> 2);
  return lhs;
}

এখানে আমরা কিছু seedধ্রুবক (যা মূলত এলোমেলো 0s এবং 1গুলি - এর সাথে বিশেষত এটি একটি 32 বিট নির্দিষ্ট পয়েন্ট ভগ্নাংশ হিসাবে স্বর্ণের অনুপাতের বিপরীত) এর সাথে কিছু সংযোজন এবং একটি জোর যুক্ত করে কিছু স্থানান্তরিত সংস্করণ একসাথে যুক্ত করি । এই বিরতি প্রতিসাম্য এবং প্রবর্তন কিছু "গোলমাল" যদি অন্তর্মুখী কুচি-কুচি করিয়া কাটা বস্তু মান দরিদ্র (অর্থাত, 0 প্রত্যেক উপাদান হ্যাশ কল্পনা - উপরে হ্যান্ডলগুলি এটা ভাল, একটি মলা উৎপাদিত 1এবং 0। পরে প্রতিটি মেশা গুলি আমার সরল 3*hash(a)+hash(b)কেবল একটি আউটপুট 0মধ্যে যে ক্ষেত্রে)।

(সি / সি ++ এর সাথে পরিচিত নন, তাদের size_tজন্য একটি স্বাক্ষরবিহীন পূর্ণসংখ্যার মান যা মেমরির যে কোনও অবজেক্টের আকার বর্ণনা করার জন্য যথেষ্ট বড় a৪ বিট সিস্টেমে এটি সাধারণত একটি bit৪ বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যা হয় .২ বিট সিস্টেমে , একটি 32 বিট স্বাক্ষরবিহীন পূর্ণসংখ্যার।)


সুন্দর উত্তর ইয়াক্ক। এই অ্যালগরিদম 32 বিট এবং 64 বিট উভয় সিস্টেমে সমানভাবে কাজ করে? ধন্যবাদ।
ডেভ

1
@ ডেভ আরও বিট যোগ করুন 0x9e3779b9
ইয়াক্ক - অ্যাডাম নেভ্রামামন্ট

10
ঠিক আছে, সম্পূর্ণ হওয়ার জন্য ... এখানে সম্পূর্ণ নির্ভুলতা 64 বিট ধ্রুবক (দীর্ঘ ডাবলস, এবং স্বাক্ষরযুক্ত স্বাক্ষরযুক্ত লম্বা লম্বাগুলি দিয়ে গণনা করা): 0x9e3779b97f4a7c16। মজার বিষয় এটি এখনও সমান। পিআই ব্যবহার করে একই গণনাটি পুনরায় করে সোনার অনুপাতের পরিবর্তে উত্পাদিত হয়: 0x517cc1b727220a95 যা বিজোড়, এর পরিবর্তে, সম্ভবত অন্য ধ্রুবকের চেয়ে সম্ভবত "আরও প্রধান"। আমি ব্যবহার করেছি: std :: cout << std :: hex << (স্বাক্ষরিত দীর্ঘ দীর্ঘ) ((1.0L / 3.14159265358979323846264338327950288419716939937510L) * (পাউলি (2.0L, 64.0L)) << স্টাড :: এন্ডেল; cout.precision সহ (সংখ্যাসূচক_পদ্ধতি <দীর্ঘ ডাবল> :: সর্বোচ্চ_ডিজিট 10); ধন্যবাদ আবার ইয়াক্ক
ডেভ

2
@ এই ক্ষেত্রেগুলির জন্য বিপরীতমুখী সুবর্ণ অনুপাতের নিয়মটি হ'ল প্রথম বিজোড় সংখ্যাটি আপনি করছেন গণনার তুলনায় সমান বা বড়। সুতরাং কেবল ১ যোগ করুন এটি একটি গুরুত্বপূর্ণ সংখ্যা কারণ এন * রেশিওর অনুক্রম, সর্বাধিক আকার (2 ^ 64 এখানে) যথাক্রমে পরবর্তী মানটিকে বৃহত্তম 'ফাঁক' এর মাঝখানে ঠিক সেই অনুপাতের মধ্যে রাখে নম্বর। আরও তথ্যের জন্য "ফিবোনাচি হ্যাশিং" এর জন্য ওয়েবে অনুসন্ধান করুন।
স্কট কেরি

1
@ ডেভের সঠিক নম্বরটি হবে 0.9E3779B97F4A7C15F39 ... লিঙ্কটি দেখুন । আপনি রাউন্ড টু-ইওন বিধি (যা অ্যাকাউন্টেন্টদের পক্ষে ভাল) থেকে ভুগতে পারেন, বা আপনি যদি আক্ষরিক স্কয়ার্ট (5) ধ্রুবক দিয়ে শুরু করেন, যখন আপনি 1 টি বিয়োগ করেন, আপনি হাই অর্ডার বিটটি সরিয়ে ফেলেন, বিট অবশ্যই হারিয়ে গেছে।
স্থানান্তর করুন

29

হ্যান্ড বিট-মিক্সিং বৈশিষ্ট্য সত্ত্বেও এক্সওআর এর চলাচলের কারণে হ্যাশগুলি একত্রিত করার ভাল উপায় নয় । আপনি যদি 10-টিপলসের একটি হ্যাশ টেবিলের মধ্যে {1, 2,…, 10 ut এর অনুমতিগুলি সংরক্ষণ করেন তবে কী হবে তা বিবেচনা করুন।

আরও ভাল পছন্দ হ'ল m * H(A) + H(B), যেখানে মি একটি বিশাল বিজোড় সংখ্যা।

ক্রেডিট: উপরের কম্বিনারটি বব জেনকিনসের একটি পরামর্শ ছিল।


2
কখনও কখনও commutativity একটি ভাল জিনিস, কিন্তু XOR একটি বিশ্রি পছন্দ তারপর কারণ মিলে আইটেমের সবগুলি জোড়া শুন্যতে কুচি-কুচি করিয়া কাটা বস্তু হবে। একটি গাণিতিক যোগফল ভাল; এক জোড়া মেলানো আইটেমের হ্যাশটি 32 এর পরিবর্তে কেবলমাত্র 31 টি বিট দরকারী ডেটা ধরে রাখতে পারে, তবে এটি শূন্য বজায় রাখার চেয়ে অনেক ভাল। আর একটি বিকল্প longহ'ল পাটিগণিতের যোগফলকে একটি হিসাবে গণনা করা এবং তারপরে উপরের অংশটি নীচের অংশের সাথে আবার বন্ধ করে দেওয়া।
সুপারক্যাট

1
m = 3আসলে একটি ভাল পছন্দ এবং অনেক সিস্টেমে খুব দ্রুত। মনে রাখবেন যে কোনও বিজোড় mপূর্ণসংখ্যার জন্য গুণকটি মডুলো 2^32বা 2^64তাই উল্টো হয় তাই আপনি কোনও বিট হারাচ্ছেন না।
স্টেফানকার্পিনস্কি

আপনি ম্যাক্সেন্টের বাইরে গেলে কী হয়?
বিঘ্নজনক

2
যেকোন বিজোড় সংখ্যার পরিবর্তে একের জন্য একটি প্রধান নির্বাচন করা উচিত
TermoTux

2
@ ইনফিনাম যা হ্যাশগুলি একত্রিত করার সময় প্রয়োজন হয় না।
মার্সেলো ক্যান্টোস

17

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

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


আমি আশা করি নিস্পৃহ উদাহরণটি কখনই ঘটে না, পাসওয়ার্ডগুলি নোনতা দেওয়া উচিত।
ব্যবহারকারী 60561

8

এই পৃষ্ঠাটি খুঁজে পাওয়া অন্যদের জন্য আমি স্পষ্ট করে কিছু বলতে চাই There এবং এবং OR ব্লুরাজের মতো আউটপুটকে সীমাবদ্ধ করে - ড্যানি ফ্লুঘোও নির্দেশ করার চেষ্টা করছে তবে এর চেয়ে আরও ভাল সংজ্ঞা দেওয়া যেতে পারে:

প্রথমে আমি দুটি সাধারণ ক্রিয়া সংজ্ঞায়িত করতে চাই যা আমি এটি ব্যাখ্যা করতে ব্যবহার করব: ন্যূনতম () এবং সর্বোচ্চ ()।

মিন (এ, বি) এ এবং বি এর মধ্যে ছোট যে মানটি প্রদান করবে, উদাহরণস্বরূপ: ন্যূনতম (1, 5) 1 প্রদান করে।

সর্বাধিক (এ, বি) এ এবং বি এর মধ্যে বৃহত্তর মানটি প্রদান করবে, উদাহরণস্বরূপ: সর্বোচ্চ (1, 5) 5 প্রদান করে returns

যদি আপনি দেওয়া হয়: C = A AND B

তারপরে আপনি আবিষ্কার করতে পারেন যে C <= Min(A, B)আমরা এটি জানি কারণ আপনি এবং A বা B এর 0 বিটগুলিকে 1-এ তৈরি করার মতো কিছুই নেই। সুতরাং প্রতিটি শূন্য বিট একটি শূন্য বিট থাকে এবং প্রতিটি বিটের একটি শূন্য বিট হওয়ার সুযোগ থাকে (এবং এইভাবে একটি ছোট মান) has

সঙ্গে: C = A OR B

বিপরীতটি সত্য: C >= Max(A, B)এটির সাথে আমরা AND ফাংশনটির বাস্তবায়ন দেখতে পাই। ইতিমধ্যে এক যে কোনও বিট শূন্য হয়ে ওআরড করা যায় না, তাই এটি এক থাকে, তবে প্রতিটি শূন্য বিটের একটি হয়ে ওঠার সুযোগ থাকে এবং এইভাবে আরও বড় সংখ্যা।

এটি সূচিত করে যে ইনপুটটির রাজ্য আউটপুটটিতে সীমাবদ্ধতা প্রয়োগ করে। যদি আপনি এবং 90 এর সাথে কিছু থাকে তবে আপনি জানেন যে অন্য মানটি নির্বিশেষে আউটপুট 90 এর সমান বা তার চেয়ে কম হবে।

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


6
কেউ বলতে পারে যে ORহয় , bitwise সর্বোচ্চ এবং ANDহয় , bitwise মিনিট
পাওলো ইবারম্যান

খুব ভাল পাওলো ইবারম্যান বলেছেন। এখানে আপনাকে পাশাপাশি ক্রিপ্টো.এসই দেখে ভাল লাগল!
কোরি ওগবার্ন

আমি একটি ফিল্টার তৈরি করেছি যা আমাকে ট্যাগ করা ক্রিপ্টোগ্রাফি সহ পুরানো প্রশ্নগুলিতে পরিবর্তন করে। এইভাবে আমি এখানে আপনার উত্তর খুঁজে পেয়েছি।
পাওলো ইবারম্যান

3

আপনি যদি XORপক্ষপাতদুষ্ট ইনপুট সহ একটি এলোমেলো ইনপুট, আউটপুট এলোমেলো। ANDবা একই জন্য সত্য নয় OR। উদাহরণ:

00101001 XOR 00000000 = 00101001
00101001 এবং 00000000 = 00000000
00101001 বা 11111111 = 11111111

@ গ্রেগ হিউগিল যেমন উল্লেখ করেছেন, এমনকি উভয় ইনপুটগুলি এলোমেলোভাবে ব্যবহার করা হলেও ব্যবহার করা হয় ANDবা ORপক্ষপাতদুষ্ট ফলাফল করে।

আমরা XORআরও জটিল কিছুতে ব্যবহার করার কারণটি হ'ল, ভাল, এর কোনও প্রয়োজন নেই: XORনিখুঁতভাবে কাজ করে, এবং এটি নির্লজ্জভাবে বোকা-দ্রুত।


1

বাম 2 টি কলাম কভার করুন এবং ইনপুটগুলি কী আউটপুট ব্যবহার করছে তা নিয়ে কাজ করার চেষ্টা করুন।

 a | b | a AND b
---+---+--------
 0 | 0 |    0
 0 | 1 |    0
 1 | 0 |    0
 1 | 1 |    1

আপনি যখন 1-বিট দেখেছেন তখন আপনার কাজ করা উচিত ছিল যে দুটি ইনপুটই 1।

এক্সওআর এর জন্য এখন একই কাজ করুন

 a | b | a XOR b
---+---+--------
 0 | 0 |    0
 0 | 1 |    1
 1 | 0 |    1
 1 | 1 |    0

এক্সওআর এর ইনপুট সম্পর্কে কিছুই দেয় না।


0

বিভিন্ন সংস্করণের জন্য সোর্স কোড hashCode()মধ্যে java.util.Arrays কঠিন, সাধারণ ব্যবহার হ্যাশ অ্যালগোরিদমগুলি একটি মহান রেফারেন্স। এগুলি সহজেই বোঝা যায় এবং অন্যান্য প্রোগ্রামিং ভাষায় অনুবাদ করা হয়।

মোটামুটিভাবে বলতে গেলে, বেশিরভাগ বহু-গুণাবলীর hashCode()প্রয়োগগুলি এই ধরণটি অনুসরণ করে:

public static int hashCode(Object a[]) {
    if (a == null)
        return 0;

    int result = 1;

    for (Object element : a)
        result = 31 * result + (element == null ? 0 : element.hashCode());

    return result;
}

পেছনের যাদু সম্পর্কিত 31এবং জাভা কোড কেন এটি ঘন ঘন ব্যবহার করে সে সম্পর্কে আরও তথ্যের জন্য আপনি অন্যান্য স্ট্যাকওভারফ্লো প্রশ্ন এবং অনুসন্ধান করতে পারেন । এটি অসম্পূর্ণ, তবে সাধারণ পারফরম্যান্সের খুব ভাল বৈশিষ্ট্য রয়েছে।


2
জাভার ডিফল্ট "31 দ্বারা বহুগুণ এবং অ্যাড / জমা" হ্যাশ সংঘর্ষে লোড করা হয়েছে (উদাঃ আইআইআরসি-র stringসাথে কোনও সংঘর্ষ হয় string + "AA") এবং তারা অনেক আগেই ইচ্ছা করেছিল যে তারা সেই অ্যালগরিদমে সেই অনুমানের মধ্যে বেক না করেছে। এটি বলেছে, আরও বিট সেট সহ একটি বৃহত্তর বিজোড় নম্বর ব্যবহার করা এবং একটি শিফট বা আবর্তন যুক্ত করা সমস্যার সমাধান করে। মারমুরহ্যাশ 3 এর 'মিক্স' এটি করে।
স্কট কেরি

0

XOR কখনও কখনও OR এবং AND এর মতো কিছু ইনপুট উপেক্ষা করে না ।

আপনি নিতে পারেন এবং (x, y) উদাহরণস্বরূপ, এবং ফিড ইনপুট এক্স মিথ্যা, তারপর ইনপুট দিয়ে ওয়াই ব্যাপার না ... আর এক সম্ভবত যখন হ্যাশ মিশ্রন ইনপুট ব্যাপার চাইবেন।

আপনি যদি এক্সওআর (এক্স, ওয়াই) নেন তবে উভয় ক্ষেত্রেই সবসময় ইনপুট থাকে । X এর কোনও মূল্য থাকবে না যেখানে Y এর কোনও গুরুত্ব নেই। যদি X বা Y হয় পরিবর্তন হয় তবে আউটপুটটি এটি প্রতিফলিত করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.