আমি ইন্টারনেটে অনুসন্ধান করার চেষ্টা করেছি তবে হ্যাশ করার অর্থ খুঁজে পাইনি।
যখন তারা বলে যে বস্তুগুলি হয় hashable
বা এর hashable objects
অর্থ কী?
আমি ইন্টারনেটে অনুসন্ধান করার চেষ্টা করেছি তবে হ্যাশ করার অর্থ খুঁজে পাইনি।
যখন তারা বলে যে বস্তুগুলি হয় hashable
বা এর hashable objects
অর্থ কী?
উত্তর:
থেকে পাইথন শব্দকোষ :
কোনও বস্তুর হাশযোগ্য যদি এটির একটি হ্যাশ মান থাকে যা তার জীবদ্দশায় কখনই পরিবর্তিত হয় না (এটি একটি
__hash__()
পদ্ধতির প্রয়োজন), এবং অন্যান্য বস্তুর সাথে এটির তুলনা করা যেতে পারে (এটির প্রয়োজন একটি পদ্ধতি__eq__()
বা__cmp__()
পদ্ধতি)। সমান তুলনা করা যায় এমন হাস্যযোগ্য বস্তুর একই হ্যাশ মান থাকতে হবে।হ্যাশাবিলিটি কোনও অভিধানকে কী এবং সেট সদস্য হিসাবে ব্যবহারযোগ্য করে তোলে, কারণ এই ডেটা স্ট্রাকচারগুলি হ্যাশ মানটি অভ্যন্তরীণভাবে ব্যবহার করে।
পাইথনের সমস্ত অপরিবর্তনীয় অন্তর্নির্মিত অবজেক্টগুলি হ্যাশযোগ্য, যদিও কোনও পরিবর্তনীয় পাত্রে (যেমন তালিকাগুলি বা অভিধান) নেই। ব্যবহারকারী-সংজ্ঞায়িত শ্রেণীর উদাহরণস্বরূপ অবজেক্টগুলি ডিফল্টরূপে হ্যাশযোগ্য; তারা সমস্ত অসম তুলনা করে, এবং তাদের হ্যাশ মান তাদের
id()
।
hash value
এখন হ্যাশ মান হয়। আপনি কিছু উদাহরণ দিতে পারেন
__hash__()
। আরও সাধারণভাবে, en.wikedia.org/wiki/Hash_function দেখুন
id(object)
16x এর ফলাফল object.__hash__()
। সুতরাং এই সংস্করণটির id()
জন্য গ্লসারি সংক্ষিপ্ত বিবরণ ভুল - হ্যাশ মানটি নয় , তবে এটি থেকে প্রাপ্ত (প্রকৃতপক্ষে পাইথন ২.7.১২ এর জন্য আপডেট হওয়া ডক্সে উল্লিখিত)।
hash((1, [2, 3]))
এটি কর্মে দেখার চেষ্টা করুন । আমি হ্যাশেবলের জন্য গ্লসারি এন্ট্রি সংশোধন করার জন্য একটি অনুরোধ পোস্ট করেছি।
এখানে সমস্ত উত্তরের পাইথনগুলিতে হ্যাশেবল অবজেক্টগুলির কার্যকরী ব্যাখ্যা রয়েছে তবে আমি বিশ্বাস করি প্রথমে হ্যাশিং শব্দটি বোঝার প্রয়োজন।
হ্যাশিং কম্পিউটার বিজ্ঞানের একটি ধারণা যা উচ্চ কার্যকারিতা তৈরি, সিউডো এলোমেলো অ্যাক্সেস ডেটা স্ট্রাকচার তৈরি করতে ব্যবহৃত হয় যেখানে প্রচুর পরিমাণে ডেটা সংরক্ষণ এবং দ্রুত অ্যাক্সেস করতে হয়।
উদাহরণস্বরূপ, যদি আপনার 10,000 টি ফোন নম্বর থাকে এবং আপনি এগুলিতে একটি অ্যারেতে সঞ্চয় করতে চান (এটি একটি ক্রমানুসারে ডেটা কাঠামো যা মেটাল মেমরির অবস্থানগুলিতে ডেটা সঞ্চয় করে এবং এলোমেলো অ্যাক্সেস সরবরাহ করে), তবে আপনার কাছে প্রয়োজনীয় পরিমাণের পরিমাণ না থাকতে পারে মেমরি অবস্থান।
সুতরাং, আপনি পরিবর্তে 100 মাপের একটি অ্যারে ব্যবহার করতে পারেন, এবং একই সূচকগুলিতে মানগুলির একটি সেট মানচিত্র করতে একটি হ্যাশ ফাংশন ব্যবহার করতে পারেন এবং এই মানগুলি একটি লিঙ্কযুক্ত তালিকায় সংরক্ষণ করা যেতে পারে। এটি একটি অ্যারের অনুরূপ কর্মক্ষমতা সরবরাহ করে provides
এখন, একটি হ্যাশ ফাংশন অ্যারের আকারের সাথে সংখ্যাটি বিভাজন করা এবং বাকী বাক্যটিকে সূচক হিসাবে গ্রহণ করার মতো সহজ হতে পারে।
আরও তথ্যের জন্য https://en.wikedia.org/wiki/Hash_function দেখুন
এখানে আরেকটি ভাল রেফারেন্স: http://interactivepython.org/runestone/static/pythonds/SortSearch/Hashing.html
যে কোনও কিছু পরিবর্তনযোগ্য নয় (পরিবর্তনীয় উপায়, পরিবর্তনের সম্ভাবনা) হ্যাশ করা যেতে পারে। অনুসন্ধানের জন্য হ্যাশ ফাংশন ছাড়াও, যদি কোনও শ্রেণীর কাছে এটি থাকে, যেমন। dir(tuple)
এবং __hash__
পদ্ধতিটি খুঁজছেন , এখানে কয়েকটি উদাহরণ রয়েছে
#x = hash(set([1,2])) #set unhashable
x = hash(frozenset([1,2])) #hashable
#x = hash(([1,2], [2,3])) #tuple of mutable objects, unhashable
x = hash((1,2,3)) #tuple of immutable objects, hashable
#x = hash()
#x = hash({1,2}) #list of mutable objects, unhashable
#x = hash([1,2,3]) #list of immutable objects, unhashable
অপরিবর্তনীয় ধরণের তালিকা:
int, float, decimal, complex, bool, string, tuple, range, frozenset, bytes
পরিবর্তনীয় ধরণের তালিকা:
list, dict, set, bytearray, user-defined classes
Ellipsis
এটিও একটি অপরিবর্তনীয় প্রকার এবং এটি একটি এর কী হিসাবে ব্যবহার করা যেতে পারে dict
।
hash(MyClass)
__hash__
এবং হ্যাশযোগ্য __eq__
। তদুপরি, সমস্ত ব্যবহারকারীর দ্বারা সংজ্ঞায়িত শ্রেণিগুলি এই পদ্ধতিগুলি প্রয়োগ করে (এবং এইভাবে হ্যাশযোগ্য) কারণ তারা object
(সার্বজনীন বেস-শ্রেণি) থেকে পদ্ধতিগুলির উত্তরাধিকারী ।
পাইথনের গ্লোসারি অনুসারে আমার বোধগম্যতার সাথে আপনি যখন হ্যাশযোগ্য বস্তুর উদাহরণ তৈরি করেন, তখন অপরিবর্তনীয় মানটি উদাহরণের সদস্য বা মান অনুসারে গণনা করা হয়। উদাহরণস্বরূপ, সেই মানটি তারপরে নিম্নোক্ত হিসাবে একটি ডিকের কী হিসাবে ব্যবহৃত হতে পারে:
>>> tuple_a = (1,2,3)
>>> tuple_a.__hash__()
2528502973977326415
>>> tuple_b = (2,3,4)
>>> tuple_b.__hash__()
3789705017596477050
>>> tuple_c = (1,2,3)
>>> tuple_c.__hash__()
2528502973977326415
>>> id(a) == id(c) # a and c same object?
False
>>> a.__hash__() == c.__hash__() # a and c same value?
True
>>> dict_a = {}
>>> dict_a[tuple_a] = 'hiahia'
>>> dict_a[tuple_c]
'hiahia'
আমরা দেখতে পাই যে tuple_a এবং tuple_c এর হ্যাশ মান একই কারণ তারা একই সদস্য রয়েছে। যখন আমরা ডুপ_এ-তে কী হিসাবে টিপল_এ ব্যবহার করি, আমরা দেখতে পাব যে ডিক_এ [tuple_c] এর মান একই, যার অর্থ যখন তারা ডিকের মূল হিসাবে ব্যবহৃত হয়, তারা একই মান ফিরে আসে কারণ হ্যাশ মানগুলি হয় একই. যেসব বস্তুগুলি হ্যাশেবল নয়, তাদের জন্য পদ্ধতি হ্যাশটিকে কোনও হিসাবে সংজ্ঞায়িত করা হয়নি:
>>> type(dict.__hash__)
<class 'NoneType'>
আমি অনুমান করি যে এই হ্যাশটির মানটি গতিশীল উপায়ে নয়, উদাহরণের সূচনাতে গণনা করা হয়েছে, এজন্য কেবল অপরিবর্তনীয় বস্তুগুলিই ধাবনযোগ্য। আশাকরি এটা সাহায্য করবে.
অজগরটিতে হ্যাশযোগ্য বস্তুগুলি বোঝার জন্য আমি আপনাকে একটি কার্যকর উদাহরণ দেই give আমি এই উদাহরণের জন্য ২ টি টিপল নিচ্ছি a একটি টিপল মধ্যে প্রতিটি মানের একটি অনন্য হ্যাশ মান রয়েছে যা তার জীবদ্দশায় কখনও পরিবর্তন হয় না। সুতরাং এর ভিত্তিতে মান রয়েছে, দুটি টিপলসের মধ্যে তুলনা সম্পন্ন হয়েছে। আমরা আইডি () ব্যবহার করে একটি টিপল এলিমেন্টের হ্যাশ মান পেতে পারি।
অজগরতে এর অর্থ হল যে সূচকটি ফেরত দেওয়ার জন্য বস্তুটি সেটের সদস্য হতে পারে। অর্থাৎ তাদের অনন্য পরিচয় / আইডি রয়েছে।
উদাহরণস্বরূপ, পাইথন ৩.৩ এ:
ডেটা স্ট্রাকচার তালিকাগুলি হ্যাশযোগ্য নয় তবে ডেটা স্ট্রাকচার টিউপলস হ্যাশযোগ্য।
id
, যা মেমরির মধ্যে (প্রায়) বস্তুর ঠিকানা।
হাসেবল = হ্যাশ হওয়ার যোগ্য।
ঠিক আছে, হ্যাশিং কি? একটি হ্যাশিং ফাংশন এমন একটি ফাংশন যা কোনও অবজেক্ট গ্রহণ করে, একটি স্ট্রিং যেমন "পাইথন" বলে এবং এটি একটি নির্দিষ্ট আকারের কোড দেয়। সরলতার জন্য, ধরে নিন যে রিটার্ন মানটি একটি পূর্ণসংখ্যা।
আমি যখন পাইথন 3 এ হ্যাশ ('পাইথন') চালাচ্ছি, ফলাফল হিসাবে আমি 5952713340227947791 পাই। পাইথনের বিভিন্ন সংস্করণ অন্তর্নিহিত হ্যাশ ফাংশনটি পরিবর্তন করতে বিনামূল্যে, সুতরাং আপনি সম্ভবত একটি আলাদা মান পাবেন। গুরুত্বপূর্ণ বিষয়টি হ'ল আমি এখন বহুবার হ্যাশ ('পাইথন') চালাই না কেন, আমি সবসময় পাইথনের একই সংস্করণ সহ একই ফলাফল পাব।
তবে হ্যাশ ('জাভা') 1753925553814008565 প্রদান করে So অন্যদিকে, আমি যে জিনিসটি হ্যাশ করছি তা যদি পরিবর্তন না হয় তবে ফলাফলটি একই থাকে।
কেন এই ব্যাপার?
ঠিক আছে, উদাহরণস্বরূপ, পাইথন অভিধানগুলিতে অপরিবর্তনীয় কীগুলি প্রয়োজন। অর্থাৎ কীগুলি অবশ্যই অবজেক্ট হতে হবে যা পরিবর্তিত হয় না। স্ট্রিংগুলি পাইথনে অপরিবর্তনীয়, যেমন অন্যান্য অন্যান্য মৌলিক ধরণের (ইনট, ফ্লোট, বুল)। টিপলস এবং হিমশীতলও অপরিবর্তনীয়। অন্যদিকে তালিকাগুলি অপরিবর্তনীয় নয় (যেমন, তারা পরিবর্তনীয়) কারণ আপনি এগুলি পরিবর্তন করতে পারেন। একইভাবে, dicts পরিবর্তনীয় হয়।
সুতরাং আমরা যখন কিছু বলি হ্যাশযোগ্য তখন আমাদের অর্থ এটি স্থাবর হয়। যদি আমি হ্যাশ () ফাংশনে কোনও পরিবর্তনীয় প্রকারটি পাস করার চেষ্টা করি তবে এটি ব্যর্থ হবে:
>>> hash('Python')
1687380313081734297
>>> hash('Java')
1753925553814008565
>>>
>>> hash([1, 2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash({1, 2})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> hash({1 : 2})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>>
>>> hash(frozenset({1, 2}))
-1834016341293975159
>>> hash((1, 2))
3713081631934410656
পাইথনে, কোনও অপরিবর্তনীয় বস্তু (যেমন একটি পূর্ণসংখ্যা, বুলিয়ান, স্ট্রিং, টুপল) হ্যাশযোগ্য, যার অর্থ তার জীবদ্দশায় এর মান পরিবর্তন হয় না। এটি পাইথনকে সনাক্ত করার জন্য একটি অনন্য হ্যাশ মান তৈরি করতে সহায়তা করে যা অভিধান দ্বারা অনন্য কীগুলি এবং সেটগুলি অনন্য মানগুলি ট্র্যাক করার জন্য ব্যবহার করতে পারে।
এজন্য পাইথনকে আমাদের অভিধানের কীগুলির জন্য অপরিবর্তনীয় ডেটাটাইপগুলি ব্যবহার করা প্রয়োজন।
স্ক্র্যাচ থেকে একটি হ্যাশিং টেবিল তৈরি করার জন্য, সমস্ত মানগুলি "কিছুই নয়" এ সেট করতে হবে এবং একবার প্রয়োজনীয়তা দেখা দিলে তা সংশোধন করতে হবে। হ্যাশযোগ্য অবজেক্টগুলি সংশোধনযোগ্য ডেটাটাইপগুলি (অভিধান, তালিকাগুলি ইত্যাদি) বোঝায়। অন্যদিকে সেটগুলি একবার বরাদ্দ করা হলে পুনরায় পুনর্নির্মাণ করা যায় না, সুতরাং সেটগুলি অযোগ্য নয়। যেখানে হ'ল ফ্রিজেসেন্ট () - সেট () এর রূপটি হ্যাশযোগ্য।
__hash__()
পদ্ধতিতে ডকুমেন্টেশন দেখুন ।