জন মিলিকিন এর অনুরূপ একটি সমাধান প্রস্তাব করেছিলেন:
class A(object):
def __init__(self, a, b, c):
self._a = a
self._b = b
self._c = c
def __eq__(self, othr):
return (isinstance(othr, type(self))
and (self._a, self._b, self._c) ==
(othr._a, othr._b, othr._c))
def __hash__(self):
return hash((self._a, self._b, self._c))
এই সমাধান সঙ্গে সমস্যা হ'ল hash(A(a, b, c)) == hash((a, b, c))
। অন্য কথায়, হ্যাশটির মূল সদস্যদের টিপলের সাথে সংঘর্ষ হয়। অনুশীলনে খুব সম্ভবত এটি ব্যাপার না?
আপডেট: পাইথন ডক্স এখন উপরের উদাহরণের মতো একটি টুপল ব্যবহার করার পরামর্শ দেয়। নোট করুন যে ডকুমেন্টেশন
কেবলমাত্র প্রয়োজনীয় সম্পত্তি হ'ল সমান তুলনা করা অবজেক্টগুলির একই হ্যাশ মান রয়েছে
মনে রাখবেন যে বিপরীতটি সত্য নয়। যে বস্তুগুলি সমান তুলনা করে না তাদের একই হ্যাশ মান থাকতে পারে। যেমন হ্যাশ সংঘর্ষের ফলে ডিক্ট কী বা সেট উপাদান হিসাবে ব্যবহৃত হয় যতক্ষণ না অবজেক্টগুলি সমান তুলনা না করে ততক্ষণ একটি বস্তুর অন্যটিকে প্রতিস্থাপন করতে পারে না ।
পুরানো / খারাপ সমাধান
উপর পাইথন ডকুমেন্টেশন__hash__
XOR যাও ভালো কিছু ব্যবহার উপ-উপাদান হ্যাশ একত্রিত করতে প্রস্তাব দেওয়া , যা আমাদের এই দেয়:
class B(object):
def __init__(self, a, b, c):
self._a = a
self._b = b
self._c = c
def __eq__(self, othr):
if isinstance(othr, type(self)):
return ((self._a, self._b, self._c) ==
(othr._a, othr._b, othr._c))
return NotImplemented
def __hash__(self):
return (hash(self._a) ^ hash(self._b) ^ hash(self._c) ^
hash((self._a, self._b, self._c)))
আপডেট: ব্ল্যাকএনজিএইচটি হিসাবে উল্লেখ করা হয়েছে, ক, বি এবং সি এর ক্রম পরিবর্তন করা সমস্যার কারণ হতে পারে। আমি ^ hash((self._a, self._b, self._c))
মানগুলি হ্যাশ হচ্ছে ক্রম ক্যাপচার একটি অতিরিক্ত যোগ । এই চূড়ান্ত ^ hash(...)
মান হচ্ছে মিলিত পুনর্বিন্যাস করা যাবে না যদি মুছে ফেলা হতে পারে (উদাহরণস্বরূপ, তারা বিভিন্ন ধরনের এবং সেইজন্য মান আছে যদি _a
নির্ধারিত করা হবে না _b
বা _c
, ইত্যাদি)।
__key
ফাংশনটি বাস্তবায়ন করা থেকে অপ্রাপ্তবয়স্ক ওভারহেড বাদে , এটি যে কোনও হ্যাশ হিসাবে দ্রুত হতে পারে is অবশ্যই, যদি বৈশিষ্ট্যগুলি পূর্ণসংখ্যার হিসাবে পরিচিত হয় এবং এর মধ্যে খুব বেশি কিছু না ঘটে থাকে তবে আমি মনে করি আপনি কিছু হোম-রোলড হ্যাশ দিয়ে সামান্য দ্রুত চালাতে পারবেন , তবে সম্ভবত এটি বিতরণ করা সম্ভব হবে না।hash((self.attr_a, self.attr_b, self.attr_c))
আশ্চর্যজনকভাবে দ্রুত (এবং সঠিক ) হতে চলেছে , যেহেতু ছোটtuple
গুলি তৈরি করা বিশেষভাবে অনুকূলিত হয়েছে, এবং এটি সি বিল্টিনগুলিতে হ্যাশগুলি প্রাপ্ত ও সংমিশ্রনের কাজকে ধাক্কা দেয় যা পাইথন স্তরের কোডের চেয়ে সাধারণত দ্রুত faster