টিএল; ডিআর:
দয়া করে পড়ুন শব্দকোষ : hash()বস্তু তুলনা একটি শর্টকাট হিসাবে ব্যবহার করা হয়, একটি অবজেক্ট hashable বলিয়া গণ্য যদি এটা অন্যান্য বস্তুর তুলনা করা যেতে পারে করা হয়। এজন্যই আমরা ব্যবহার করি hash()। এটি অ্যাক্সেস করতে dictএবং setউপাদানগুলিকে ব্যবহার করা হয় যা সিপিথনে পুনরায় আকার পরিবর্তনযোগ্য হ্যাশ টেবিল হিসাবে প্রয়োগ করা হয় ।
প্রযুক্তিগত বিবেচনা
- সাধারণত বস্তুর তুলনা করা (যা বিভিন্ন স্তরের পুনরাবৃত্তি জড়িত থাকতে পারে) ব্যয়বহুল।
- সাধারণত,
hash()ফাংশনটি কম ব্যয়বহুলতার (বা বেশ কয়েকটি) ক্রম।
- দুটি হ্যাশের তুলনা করা দুটি বস্তুর তুলনায় সহজ, শর্টকাটটি এখানে।
অভিধানগুলি কীভাবে প্রয়োগ করা হয় সে সম্পর্কে যদি আপনি পড়েন তবে তারা হ্যাশ টেবিলগুলি ব্যবহার করে যার অর্থ কোনও শব্দ থেকে কোনও কী অর্জন করা হ'ল অভিধানগুলিতে অবজেক্টগুলি পুনরুদ্ধারের জন্য একটি কোণার পাথর O(1)। এটি সংঘর্ষ-প্রতিরোধী হতে আপনার হ্যাশ ফাংশনের উপর খুব নির্ভরশীল । একটি আইটেম পাওয়ার জন্য সবচেয়ে খারাপ ক্ষেত্রে অভিধানে আসলে O(n)।
এই নোটে, পরিবর্তনীয় অবজেক্টগুলি সাধারণত হ্যাশযোগ্য হয় না। হ্যাশযোগ্য সম্পত্তি মানে আপনি কোনও বস্তুটিকে কী হিসাবে ব্যবহার করতে পারেন। যদি হ্যাশ মানটি কী হিসাবে ব্যবহৃত হয় এবং একই বস্তুর বিষয়বস্তু পরিবর্তিত হয়, তবে হ্যাশ ফাংশনটি কী ফিরে আসতে হবে? এটি একই কী বা অন্যরকম? এটি আপনার হ্যাশ ফাংশনটি কীভাবে সংজ্ঞায়িত করে তার উপর নির্ভর করে।
উদাহরণস্বরূপ শেখা:
কল্পনা করুন আমাদের এই শ্রেণি রয়েছে:
>>> class Person(object):
... def __init__(self, name, ssn, address):
... self.name = name
... self.ssn = ssn
... self.address = address
... def __hash__(self):
... return hash(self.ssn)
... def __eq__(self, other):
... return self.ssn == other.ssn
...
দয়া করে নোট করুন: এসএসএন কখনই কোনও ব্যক্তির জন্য পরিবর্তিত হয় না (এই বিষয়টি সত্যিকারের উত্স থেকে সত্য সত্য যাচাই করতে হবে তাও জানেন না) এই ধারণার উপর ভিত্তি করে।
এবং আমাদের বব আছে:
>>> bob = Person('bob', '1111-222-333', None)
নিজের নাম পরিবর্তন করতে বজ একজন বিচারকের সাথে দেখা করতে যান:
>>> jim = Person('jim bo', '1111-222-333', 'sf bay area')
এটি আমরা জানি:
>>> bob == jim
True
তবে এগুলি একই ব্যক্তির দুটি পৃথক রেকর্ডের মতো আলাদা মেমোরির বরাদ্দযুক্ত দুটি পৃথক বস্তু:
>>> bob is jim
False
এখন সেই অংশটি এসেছে যেখানে হ্যাশ () ব্যবহারযোগ্য:
>>> dmv_appointments = {}
>>> dmv_appointments[bob] = 'tomorrow'
অনুমান কি:
>>> dmv_appointments[jim]
'tomorrow'
দুটি ভিন্ন রেকর্ড থেকে আপনি একই তথ্য অ্যাক্সেস করতে সক্ষম হন। এখন এটি চেষ্টা করুন:
>>> dmv_appointments[hash(jim)]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 9, in __eq__
AttributeError: 'int' object has no attribute 'ssn'
>>> hash(jim) == hash(hash(jim))
True
এটা ঠিক কি ঘটল? এটি একটি সংঘর্ষ। কারণ hash(jim) == hash(hash(jim))যা উভয় পূর্ণসংখ্যার BTW, আমরা ইনপুট তুলনা করতে প্রয়োজন __getitem__যে ধাক্কা লাগা সব আইটেম সঙ্গে। বিল্টিনের intকোনও ssnবৈশিষ্ট্য নেই তাই এটি ট্রিপ করে।
>>> del Person.__eq__
>>> dmv_appointments[bob]
'tomorrow'
>>> dmv_appointments[jim]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: <__main__.Person object at 0x7f611bd37110>
এই শেষ উদাহরণে, আমি দেখাই যে সংঘর্ষের সাথেও তুলনাটি সম্পাদন করা হয়, বস্তুগুলি আর সমান হয় না, যার অর্থ এটি সফলভাবে উত্থাপন করে a KeyError।