পাইথনে "হ্যাশেবল" এর অর্থ কী?


193

আমি ইন্টারনেটে অনুসন্ধান করার চেষ্টা করেছি তবে হ্যাশ করার অর্থ খুঁজে পাইনি।

যখন তারা বলে যে বস্তুগুলি হয় hashableবা এর hashable objectsঅর্থ কী?


1
হ্যাশেবল এবং __hash__()পদ্ধতিতে ডকুমেন্টেশন দেখুন ।
26sәɹoɈ

5
যা অযোগ্য জিনিস বা অন্য কিছুর সন্ধান করে, তবে লিঙ্কগুলির মধ্যে কোনওটিই হ্যাশযোগ্য আসলে কী বোঝায় তা ব্যাখ্যা করে না
user1755071

উত্তর:


180

থেকে পাইথন শব্দকোষ :

কোনও বস্তুর হাশযোগ্য যদি এটির একটি হ্যাশ মান থাকে যা তার জীবদ্দশায় কখনই পরিবর্তিত হয় না (এটি একটি __hash__()পদ্ধতির প্রয়োজন), এবং অন্যান্য বস্তুর সাথে এটির তুলনা করা যেতে পারে (এটির প্রয়োজন একটি পদ্ধতি __eq__()বা __cmp__()পদ্ধতি)। সমান তুলনা করা যায় এমন হাস্যযোগ্য বস্তুর একই হ্যাশ মান থাকতে হবে।

হ্যাশাবিলিটি কোনও অভিধানকে কী এবং সেট সদস্য হিসাবে ব্যবহারযোগ্য করে তোলে, কারণ এই ডেটা স্ট্রাকচারগুলি হ্যাশ মানটি অভ্যন্তরীণভাবে ব্যবহার করে।

পাইথনের সমস্ত অপরিবর্তনীয় অন্তর্নির্মিত অবজেক্টগুলি হ্যাশযোগ্য, যদিও কোনও পরিবর্তনীয় পাত্রে (যেমন তালিকাগুলি বা অভিধান) নেই। ব্যবহারকারী-সংজ্ঞায়িত শ্রেণীর উদাহরণস্বরূপ অবজেক্টগুলি ডিফল্টরূপে হ্যাশযোগ্য; তারা সমস্ত অসম তুলনা করে, এবং তাদের হ্যাশ মান তাদের id()


2
যদি এটি hash valueএখন হ্যাশ মান হয়। আপনি কিছু উদাহরণ দিতে পারেন
user1755071

2
@ user55711: এখানে, হ্যাশ মানটি কল করার ফলাফল __hash__()। আরও সাধারণভাবে, en.wikedia.org/wiki/Hash_function দেখুন
এনপিই

16
@ টারস্টেনব্রোনার: কারণ দুটি অসম বস্তু একই মানকে হ্যাশ করতে পারে। অন্য কথায়, হ্যাশিং ক্ষয়ক্ষতিযুক্ত।
এনপিই

1
পাইথন -২.7.১২ এ, ফলাফলটি id(object)16x এর ফলাফল object.__hash__()। সুতরাং এই সংস্করণটির id()জন্য গ্লসারি সংক্ষিপ্ত বিবরণ ভুল - হ্যাশ মানটি নয় , তবে এটি থেকে প্রাপ্ত (প্রকৃতপক্ষে পাইথন ২.7.১২ এর জন্য আপডেট হওয়া ডক্সে উল্লিখিত)।
ডেভিডা

2
আমি জানি এটি একটি পুরানো পোস্ট, তবে এটি এখানে উল্লেখ করা দরকার যে এখানে অনুলিপি করা শব্দকোষগুলি সম্পূর্ণ সঠিক নয়। আপনি একটি টিউপলের অভ্যন্তরে একটি পরিবর্তনীয় বস্তু (তালিকার মতো) রাখতে পারেন। টিপলটি এখনও অপরিবর্তনীয় তবে আপনি এটির ভিতরে তালিকাটি পরিবর্তন করতে পারেন, সুতরাং এটি হ্যাশযোগ্য নয়। hash((1, [2, 3]))এটি কর্মে দেখার চেষ্টা করুন । আমি হ্যাশেবলের জন্য গ্লসারি এন্ট্রি সংশোধন করার জন্য একটি অনুরোধ পোস্ট করেছি।
জন রিহেল

102

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

হ্যাশিং কম্পিউটার বিজ্ঞানের একটি ধারণা যা উচ্চ কার্যকারিতা তৈরি, সিউডো এলোমেলো অ্যাক্সেস ডেটা স্ট্রাকচার তৈরি করতে ব্যবহৃত হয় যেখানে প্রচুর পরিমাণে ডেটা সংরক্ষণ এবং দ্রুত অ্যাক্সেস করতে হয়।

উদাহরণস্বরূপ, যদি আপনার 10,000 টি ফোন নম্বর থাকে এবং আপনি এগুলিতে একটি অ্যারেতে সঞ্চয় করতে চান (এটি একটি ক্রমানুসারে ডেটা কাঠামো যা মেটাল মেমরির অবস্থানগুলিতে ডেটা সঞ্চয় করে এবং এলোমেলো অ্যাক্সেস সরবরাহ করে), তবে আপনার কাছে প্রয়োজনীয় পরিমাণের পরিমাণ না থাকতে পারে মেমরি অবস্থান।

সুতরাং, আপনি পরিবর্তে 100 মাপের একটি অ্যারে ব্যবহার করতে পারেন, এবং একই সূচকগুলিতে মানগুলির একটি সেট মানচিত্র করতে একটি হ্যাশ ফাংশন ব্যবহার করতে পারেন এবং এই মানগুলি একটি লিঙ্কযুক্ত তালিকায় সংরক্ষণ করা যেতে পারে। এটি একটি অ্যারের অনুরূপ কর্মক্ষমতা সরবরাহ করে provides

এখন, একটি হ্যাশ ফাংশন অ্যারের আকারের সাথে সংখ্যাটি বিভাজন করা এবং বাকী বাক্যটিকে সূচক হিসাবে গ্রহণ করার মতো সহজ হতে পারে।

আরও তথ্যের জন্য https://en.wikedia.org/wiki/Hash_function দেখুন

এখানে আরেকটি ভাল রেফারেন্স: http://interactivepython.org/runestone/static/pythonds/SortSearch/Hashing.html


1
হ্যাশিং সম্পর্কে এটি একটি আকর্ষণীয় দৃষ্টিভঙ্গি। আমি এটি সেভাবে ভাবিনি।
যুবগীন

@ ইউভগিন হ্যাশ-টেবিলগুলি প্রায়শই স্পার-অ্যারে বাস্তবায়নের জন্য ব্যবহৃত হয় (যেমন এখানে দেওয়া উদাহরণ)।
এলি করভিগো

@ এলিকোর্ভিগো আমি নিয়মিত অ্যারেগুলিকে হ্যাশ টেবিলের কেবলমাত্র অনুকূলিত সংস্করণ হিসাবে ভাবতে চাই।
মার্ক

1
আপনি কি হ্যাশিংয়ের ধারণাটি পরিষ্কার করতে ফোন নম্বর অ্যারের দৃশ্যাবলী সম্পর্কিত কিছু সাধারণ কোড তৈরি করতে পারেন?
ইসতিয়াক আহমেদ

18

যে কোনও কিছু পরিবর্তনযোগ্য নয় (পরিবর্তনীয় উপায়, পরিবর্তনের সম্ভাবনা) হ্যাশ করা যেতে পারে। অনুসন্ধানের জন্য হ্যাশ ফাংশন ছাড়াও, যদি কোনও শ্রেণীর কাছে এটি থাকে, যেমন। 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)
গবার ফেকতে

1
@ G definedborFekete ব্যবহারকারীর সংজ্ঞায়িত শ্রেণীর উদাহরণগুলি যদি তাদের ক্লাসগুলি প্রয়োগ করে __hash__এবং হ্যাশযোগ্য __eq__। তদুপরি, সমস্ত ব্যবহারকারীর দ্বারা সংজ্ঞায়িত শ্রেণিগুলি এই পদ্ধতিগুলি প্রয়োগ করে (এবং এইভাবে হ্যাশযোগ্য) কারণ তারা object(সার্বজনীন বেস-শ্রেণি) থেকে পদ্ধতিগুলির উত্তরাধিকারী ।
এলি করভিগো

7

পাইথনের গ্লোসারি অনুসারে আমার বোধগম্যতার সাথে আপনি যখন হ্যাশযোগ্য বস্তুর উদাহরণ তৈরি করেন, তখন অপরিবর্তনীয় মানটি উদাহরণের সদস্য বা মান অনুসারে গণনা করা হয়। উদাহরণস্বরূপ, সেই মানটি তারপরে নিম্নোক্ত হিসাবে একটি ডিকের কী হিসাবে ব্যবহৃত হতে পারে:

>>> 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'>

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


4

অজগরটিতে হ্যাশযোগ্য বস্তুগুলি বোঝার জন্য আমি আপনাকে একটি কার্যকর উদাহরণ দেই give আমি এই উদাহরণের জন্য ২ টি টিপল নিচ্ছি a একটি টিপল মধ্যে প্রতিটি মানের একটি অনন্য হ্যাশ মান রয়েছে যা তার জীবদ্দশায় কখনও পরিবর্তন হয় না। সুতরাং এর ভিত্তিতে মান রয়েছে, দুটি টিপলসের মধ্যে তুলনা সম্পন্ন হয়েছে। আমরা আইডি () ব্যবহার করে একটি টিপল এলিমেন্টের হ্যাশ মান পেতে পারি।

2 টি টিপলসের মধ্যে তুলনা2 টি টিপলসের মধ্যে সমতা


26
এটি চিত্রের চেয়ে পাঠ্য হিসাবে আরও কার্যকর হবে
বেক্সেক্স

7
এটি একটি ভুল উত্তর। আইডি () একটি মেমরিতে রেফারেন্স ঠিকানা দেখায়, এটি কোনও হ্যাশ মান নয়। হ্যাশ পাওয়ার জন্য __hash __ () ফাংশনটি ব্যবহার করুন। যেমন: t1 .__ হ্যাশ __ ()
ভ্লাদ

@ অ্যাসেস্টম্যান এমন কোনও উত্তর সম্পাদনা করতে দ্বিধা করবেন না যে আপনি বিশ্বাস করেন যে এটি ভুল। আপনার সম্পাদনাটি পিয়ার-রিভিউ করা হবে এবং যদি স্বীকার করা হয় তবে আপনি এর জন্য একটি ছোট স্কোর পুরষ্কার পাবেন।
জাভিয়েরস্টুউ

4

অজগরতে এর অর্থ হল যে সূচকটি ফেরত দেওয়ার জন্য বস্তুটি সেটের সদস্য হতে পারে। অর্থাৎ তাদের অনন্য পরিচয় / আইডি রয়েছে।

উদাহরণস্বরূপ, পাইথন ৩.৩ এ:

ডেটা স্ট্রাকচার তালিকাগুলি হ্যাশযোগ্য নয় তবে ডেটা স্ট্রাকচার টিউপলস হ্যাশযোগ্য।


হ্যাশটি সমান নয় id, যা মেমরির মধ্যে (প্রায়) বস্তুর ঠিকানা।
পুলি

3

হাসেবল = হ্যাশ হওয়ার যোগ্য।

ঠিক আছে, হ্যাশিং কি? একটি হ্যাশিং ফাংশন এমন একটি ফাংশন যা কোনও অবজেক্ট গ্রহণ করে, একটি স্ট্রিং যেমন "পাইথন" বলে এবং এটি একটি নির্দিষ্ট আকারের কোড দেয়। সরলতার জন্য, ধরে নিন যে রিটার্ন মানটি একটি পূর্ণসংখ্যা।

আমি যখন পাইথন 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

1
নোট করুন যে অজগর এলোমেলোভাবে প্রতিটি প্রক্রিয়া শুরু হওয়ার পরে হ্যাশিং অ্যালগরিদম বীজ করে। অতএব, আপনি যদি বিভিন্ন প্রক্রিয়াতে দু'বার হ্যাশ ('পাইথন') চালান তবে আপনি আসলে বিভিন্ন হ্যাশ মান পাবেন।
ডি হাডসন

2

পাইথনে, কোনও অপরিবর্তনীয় বস্তু (যেমন একটি পূর্ণসংখ্যা, বুলিয়ান, স্ট্রিং, টুপল) হ্যাশযোগ্য, যার অর্থ তার জীবদ্দশায় এর মান পরিবর্তন হয় না। এটি পাইথনকে সনাক্ত করার জন্য একটি অনন্য হ্যাশ মান তৈরি করতে সহায়তা করে যা অভিধান দ্বারা অনন্য কীগুলি এবং সেটগুলি অনন্য মানগুলি ট্র্যাক করার জন্য ব্যবহার করতে পারে।

এজন্য পাইথনকে আমাদের অভিধানের কীগুলির জন্য অপরিবর্তনীয় ডেটাটাইপগুলি ব্যবহার করা প্রয়োজন।


-1

স্ক্র্যাচ থেকে একটি হ্যাশিং টেবিল তৈরি করার জন্য, সমস্ত মানগুলি "কিছুই নয়" এ সেট করতে হবে এবং একবার প্রয়োজনীয়তা দেখা দিলে তা সংশোধন করতে হবে। হ্যাশযোগ্য অবজেক্টগুলি সংশোধনযোগ্য ডেটাটাইপগুলি (অভিধান, তালিকাগুলি ইত্যাদি) বোঝায়। অন্যদিকে সেটগুলি একবার বরাদ্দ করা হলে পুনরায় পুনর্নির্মাণ করা যায় না, সুতরাং সেটগুলি অযোগ্য নয়। যেখানে হ'ল ফ্রিজেসেন্ট () - সেট () এর রূপটি হ্যাশযোগ্য।

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