সংক্ষিপ্তসার: এটি কোনও কাকতালীয় ঘটনা নয়; পাইথনের ডিফল্ট _PyHASH_INF
সিপথন বাস্তবায়নে হার্ডকোডটি 314159 হিসাবে রয়েছে এবং 2000 সালে টিম পিটার্স কর্তৃক নির্বিচার মান হিসাবে (স্পষ্টত π এর অঙ্কগুলি থেকে) বেছে নেওয়া হয়েছিল ।
মান hash(float('inf'))
সাংখ্যিক ধরনের জন্য বিল্ট ইন হ্যাশ ফাংশন সিস্টেম নির্ভর পরামিতি এক, এবং পাওয়া যায় যেমন sys.hash_info.inf
পাইথন 3:
>>> import sys
>>> sys.hash_info
sys.hash_info(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003, algorithm='siphash24', hash_bits=64, seed_bits=128, cutoff=0)
>>> sys.hash_info.inf
314159
( পাইপাইয়ের সাথেও একই ফলাফল ))
কোডের ক্ষেত্রে, hash
একটি অন্তর্নির্মিত ফাংশন। একটি পাইথন ভাসা বস্তুর উপর এটি কলিং ফাংশন যার পয়েন্টার দেওয়া হয় এমন কিছুকে ডাকে, tp_hash
অ্যাট্রিবিউট বিল্ট-ইন ভাসা প্রকার (এর PyTypeObject PyFloat_Type
), যা হয়float_hash
ফাংশন, সংজ্ঞায়িত হিসাবে return _Py_HashDouble(v->ob_fval)
, যেটা ঘুরে ফিরে গেছে
if (Py_IS_INFINITY(v))
return v > 0 ? _PyHASH_INF : -_PyHASH_INF;
যেখানে _PyHASH_INF
হয় হিসাবে সংজ্ঞায়িত 314159:
#define _PyHASH_INF 314159
ইতিহাসের নিরিখে প্রথম উল্লেখ 314159
পাইথন কোডে এই প্রেক্ষাপটে (আপনি এই সঙ্গে জানতে পারেন git bisect
বা git log -S 314159 -p
) দ্বারা যোগ করা হয়েছিল টিম পিটার্স এখন কমিট হয় আগস্ট 2000 সালে, 39dce293 মধ্যে cpython
Git সংগ্রহস্থলের।
প্রতিশ্রুতিবদ্ধ বার্তা বলেছেন:
Http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470 এর জন্য ঠিক করুন । এটি একটি বিভ্রান্তিমূলক বাগ ছিল - সত্য "বাগ" হ'ল অসীম hash(x)
হলে ত্রুটি ফিরে পেয়েছিল x
। স্থির। এতে নতুন Py_IS_INFINITY
ম্যাক্রো যুক্ত হয়েছে
pyport.h
। ট্রান্টের আগের ছুরিকাটিকে একটি যৌক্তিক উপসংহারে ঠেলে দিয়ে ভাসা এবং জটিল সংখ্যার হ্যাশিংয়ের ক্রমবর্ধমান সদৃশতা হ্রাস করার জন্য পুনরায় সাজানো কোড। স্থিরভাবে অত্যন্ত বিরল বাগ যেখানে ফ্লোটের হ্যাশিং -১ ফিরে আসতে পারে এমনকি যদি কোনও ত্রুটি না ঘটে (পরীক্ষার কেসটি নির্মাণের চেষ্টা করার সময় নষ্ট না করে, এটি ঘটতে পারে এমন কোড থেকে এটি পরিষ্কার ছিল )। জটিল হ্যাশ উন্নত হয়েছে যাতে
hash(complex(x, y))
পদ্ধতিগতভাবে hash(complex(y, x))
আর সমান হয় না।
বিশেষ করে, এই কমিট তিনি কোডটি ripped static long float_hash(PyFloatObject *v)
মধ্যে Objects/floatobject.c
এবং এটা তৈরি return _Py_HashDouble(v->ob_fval);
, এবং সংজ্ঞা long _Py_HashDouble(double v)
মধ্যে Objects/object.c
তিনি লাইন যোগ করেছেন:
if (Py_IS_INFINITY(intpart))
/* can't convert to long int -- arbitrary */
v = v < 0 ? -271828.0 : 314159.0;
সুতরাং উল্লিখিত হিসাবে, এটি একটি স্বেচ্ছাসেবী পছন্দ ছিল। নোট করুন যে 271828 ই এর প্রথম কয়েকটি দশমিক সংখ্যা থেকে গঠিত ।
সম্পর্কিত পরে প্রতিশ্রুতিবদ্ধ:
hash(float('nan'))
হ'ল যতটা ইচ্ছাকৃত0
।