Boolean.hashCode ()


121

hashCode()বর্গ বুলিয়ান পদ্ধতি ভালো বাস্তবায়িত হয়:

public int hashCode() {
    return value ? 1231 : 1237;
}

কেন এটি 1231 এবং 1237 ব্যবহার করে? আর কিছু না কেন?


1
এই দুটি সংখ্যা যথেষ্ট বড় মৌলিক সংখ্যা। আরও তথ্যের জন্য দয়া করে উইকিপিডিয়ায় হ্যাশ টেবিলের নিবন্ধটি পড়ুন ।
বরিস পাভলভিć

উত্তর:


139

1231 এবং 1237 কেবল দুটি (পর্যাপ্ত পরিমাণে) স্বেচ্ছাসেবী সংখ্যা । অন্য দুটি বড় সংখ্যক সূক্ষ্ম কাজ করবে।

প্রাইমস কেন?
ধরুন যে এক সেকেন্ডের জন্য আমরা সম্মিলিত সংখ্যাগুলি বেছে নিয়েছি (নন-প্রাইমগুলি), 1000 এবং 2000 বলুন a যখন একটি হ্যাশ টেবিলের মধ্যে বুলিয়ানগুলি সন্নিবেশ করা হচ্ছে তখন সত্য এবং মিথ্যা বালতি 1000 % Nশ্রমের মধ্যে যাবে 2000 % N(যেখানে বালতির Nসংখ্যা রয়েছে)।

এখন লক্ষ্য করুন

  • 1000 % 8 হিসাবে একই বালতি 2000 % 8
  • 1000 % 10 হিসাবে একই বালতি 2000 % 10
  • 1000 % 20 হিসাবে একই বালতি 2000 % 20
  • ....

অন্য কথায়, এটি অনেক সংঘর্ষে বাড়ে

এটি কারণ (1000 (2 3 , 5 3 ) এর ফ্যাক্টরাইজেশন এবং 2000 (2 4 , 5 3 ) এর গুণককরণের এতগুলি সাধারণ কারণ রয়েছে। সুতরাং প্রাথমিক সংখ্যাগুলি বেছে নেওয়া হয়, যেহেতু তাদের বালতির আকারের কোনও সাধারণ কারণের সম্ভাবনা নেই।

কেন বড় প্রাইমস। 2 এবং 3 করবেন না?
সম্মিলিত বস্তুর জন্য হ্যাশ কোডগুলি গণনা করার সময় উপাদানগুলির জন্য হ্যাশ কোড যুক্ত করা সাধারণ common বিপুল সংখ্যক বালতি সহ হ্যাশ সেটটিতে যদি খুব ছোট মান ব্যবহার করা হয় তবে অবজেক্টগুলির অসম বন্টন শেষ হওয়ার ঝুঁকি রয়েছে।

সংঘর্ষের বিষয়টি কি গুরুত্বপূর্ণ? বুলিয়ানদের যেভাবেই দুটি আলাদা মান রয়েছে?
মানচিত্রগুলিতে অন্যান্য বস্তুর সাথে বুলিয়ান থাকতে পারে। এছাড়াও, ড্রুনিক্সের নির্দেশ অনুসারে, যৌগিক বস্তুর হ্যাশ ফাংশন তৈরির একটি সাধারণ উপায় হ'ল সাব-কম্পোনেন্টগুলির হ্যাশ কোড বাস্তবায়ন পুনরায় ব্যবহার করা যার ক্ষেত্রে বড় প্রাইমগুলি ফিরিয়ে দেওয়া ভাল।

সম্পর্কিত প্রশ্নগুলি:


1
আমি মনে করি এগুলি যথেষ্ট বড়। 1 এর চেয়ে বেশি জিসিডি পেতে আপনার কমপক্ষে 2*1231 = 2462বালতি প্রয়োজন । সংঘর্ষের পরিস্থিতি কি এমন পরিস্থিতিতে আছে?
আইয়ুব

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

2
হ্যাঁ, এটি আমাকে খুব আঘাত করেছিল যে তারা এত বড় নয়। তবে আপনি কি বিশ্বাস করেন যে বড় প্রাইমগুলির সাথে একটি উচ্চ ব্যয় আছে?
আইয়ুব

3
@Thilo আপনি 1231 * 1237 = 1,522,747 বাকেট একটি একাধিক আগে তারা ধাক্কা লাগা হবে প্রয়োজন চাই, যে প্রচুর বৃহৎ যথেষ্ট
র্যাচিট খামখেয়াল

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

2

উপরে বর্ণিত সমস্তগুলি ছাড়াও এটি বিকাশকারীদের থেকে একটি ছোট ইস্টার ডিমও হতে পারে:

সত্য: 1231 => 1 + 2 + 3 + 1 = 7

7 - ইউরোপীয় traditionsতিহ্যের একটি ভাগ্যবান সংখ্যা;

মিথ্যা: 1237 => 1 + 2 + 3 + 7 = 13

13 (ওরফে ডেভিলের ডজন) - দুর্ভাগ্য সংখ্যা।

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