পাইথন ৩.৩-এ হ্যাশ ফাংশন সেশনের মধ্যে বিভিন্ন ফলাফল দেয়


106

আমি পাইথন ৩.৩ এ ব্লুমফিল্টার প্রয়োগ করেছি এবং প্রতি সেশনে বিভিন্ন ফলাফল পেয়েছি। এই অদ্ভুত আচরণটি ছিটিয়ে দেওয়া আমাকে অভ্যন্তরীণ হ্যাশ () ফাংশনে নিয়ে আসে - এটি প্রতিটি সেশনে একই স্ট্রিংয়ের জন্য বিভিন্ন হ্যাশ মান প্রদান করে।

উদাহরণ:

>>> hash("235")
-310569535015251310

----- একটি নতুন অজগর কনসোল খোলা হচ্ছে -----

>>> hash("235")
-1900164331622581997

ইহা কি জন্য ঘটিতেছে? কেন এটি দরকারী?

উত্তর:


140

পাইথন আক্রমণকারীদের সংঘর্ষের জন্য পরিকল্পিত কীগুলি প্রেরণ করে আপনার অ্যাপ্লিকেশনটিকে টর্-পিটিং থেকে আটকাতে র্যান্ডম হ্যাশ বীজ ব্যবহার করে। দেখুন মূল দুর্বলতা প্রকাশ । এলোমেলো বীজ দিয়ে একটি হ্যাশ অফসেট করে (স্টার্টআপে একবার সেট করা হয়) আক্রমণকারীরা আর কী কী সংঘর্ষে হবে তা ভবিষ্যদ্বাণী করতে পারে না।

আপনি একটি নির্দিষ্ট বীজ সেট করতে পারেন বা PYTHONHASHSEEDপরিবেশের পরিবর্তনশীল সেট করে বৈশিষ্ট্যটি অক্ষম করতে পারেন ; ডিফল্টটি হ'ল randomতবে 0বৈশিষ্ট্যটি পুরোপুরি অক্ষম করে আপনি এটি একটি নির্দিষ্ট ধনাত্মক পূর্ণসংখ্য মানকে সেট করতে পারেন ।

পাইথন সংস্করণ ২.7 এবং ৩.২ এ বৈশিষ্ট্যটি ডিফল্টরূপে অক্ষম করা আছে ( এটি সক্ষম করতে -Rস্যুইচটি ব্যবহার করুন বা সেট করুন PYTHONHASHSEED=random); এটি পাইথন ৩.৩ এবং তার মধ্যে পূর্বনির্ধারিতভাবে সক্ষম হয়।

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

এছাড়াও object.__hash__()বিশেষ পদ্ধতির ডকুমেন্টেশন দেখুন :

দ্রষ্টব্য : ডিফল্টরূপে, __hash__()স্ট্র, বাইটস এবং ডেটটাইম অবজেক্টের মানগুলি একটি অনির্দেশ্য র্যান্ডম মান সহ "সল্টেড" হয়। যদিও তারা পৃথক পাইথন প্রক্রিয়াতে স্থির থাকে, পাইথনের পুনরাবৃত্তি আহ্বানের মধ্যে তারা অনুমানযোগ্য নয়।

এটি সতর্কতার সাথে নির্বাচিত ইনপুটগুলির দ্বারা সৃষ্ট অস্বীকৃত পরিষেবার বিরুদ্ধে সুরক্ষা প্রদানের উদ্দেশ্যে যা ডিক্স সন্নিবেশনের সবচেয়ে খারাপ ক্ষেত্রে কর্মক্ষমতা, O (n ^ 2) জটিলতার শোষণ করে। Http://www.ocert.org/advisories/ocert-2011-003.html দেখুন

হ্যাশ মান পরিবর্তন করা ডিকটস, সেট এবং অন্যান্য ম্যাপিংয়ের পুনরাবৃত্তির ক্রমকে প্রভাবিত করে। পাইথন কখনও এই অর্ডারিং সম্পর্কে গ্যারান্টি দেয় নি (এবং এটি সাধারণত 32-বিট এবং 64-বিট বিল্ডের মধ্যে পরিবর্তিত হয়)।

এছাড়াও দেখুন PYTHONHASHSEED

আপনার যদি একটি স্থিতিশীল হ্যাশ বাস্তবায়ন প্রয়োজন, আপনি সম্ভবত hashlibমডিউলটি দেখতে চান ; এটি ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন প্রয়োগ করে। Pybloom প্রকল্পের এই পদ্ধতির ব্যবহার

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


13
আমি আশা করব এটি হ্যাশ () ডক্সে প্রদর্শিত হবে এবং কেবল __hash __ () এ নয়। একটি দুর্দান্ত উত্তরের জন্য +1। PS কি হ্যাশ ফাংশনগুলির নন-ক্রিপ্টোগ্রাফিক ব্যবহারের জন্য ওভারকিল হ্যাশলিব নয়?
redlus

4
পাইব্লুম হ্যাশলিব ফাংশন ব্যবহার করে। তবে আপনি যদি দ্রুত কিছু চান তবে আপনি পাইশা পরীক্ষা করে দেখতে পারেন
হাকেন idাকনা

4
ডকুমেন্টেশন disable0 এ সেট করার সময় কেন এটি কল করে ? আমি কোনও পুরানো স্থিতিশীল বীজ সংখ্যায় সেট করার কার্যকর পার্থক্যটি দেখতে পাচ্ছি না, যদি না আমি কিছু মিস করি। আমার অর্থটি হ'ল আমি যখন ব্যবহার PYTHONHASHSEED=12345করি তখনও আমি একই সেশনের জন্য একই হ্যাশ পেয়ে থাকি এমনকি যখন আমি ব্যবহার করি তখন একই রকম হয় PYTHONHASHSEED=0- সমান স্ট্রিংগুলির জন্য হ্যাশগুলি একই সেশনগুলিতে একই হবে (যদিও 12345 এর চেয়ে পৃথক, তবে এটি স্পষ্টতই বীজ রয়েছে work)।
blubberdiblub

@ ব্লুবার্ডিবলুব: 0এখানে কোনও বীজ নেই এবং অবজেক্টের জন্য হ্যাশগুলি হ্যাশসিড সমর্থন ছাড়াই পুরানো পাইথন সংস্করণে উত্পন্ন সমান।
মার্টিজন পিটারস

4
@ মার্তিজ্নপিটাররা ক্ষতিগ্রস্থ হ্যাশগুলির "বিনা বীজ" না থাকার অর্থ কী? 12345 এর বীজ থাকার ক্ষেত্রে অর্থগত বা গুণগত পার্থক্য কী, এটি দুটি পৃথক পৃথক সেশন তৈরি করে যার মধ্যে হ্যাশ মানগুলি পৃথক এবং পাইথনহ্যাসেড = 0 পুরানো সংস্করণের সমান? আপনি কি আমাকে একটি নির্দিষ্ট উত্স কোডের সাথে লিঙ্ক করতে পারেন? আমার ধারণাটি হ'ল যদি এরকম কোনও তফাত না থাকে তবে আমি এটিকে 0 এর বীজ এবং পাইথনের পুরানো সংস্করণগুলি কেবল 0 এর বীজকে সমর্থন করব The ডকুমেন্টেশনটি এখনই দাঁড়িয়ে থাকা আমার কাছে বেশ বিভ্রান্তিকর।
blubberdiblub

10

পাইথন 3-এ ডিফল্টরূপে হ্যাশ র্যান্ডমাইজেশন চালু করা হয় । এটি একটি সুরক্ষা বৈশিষ্ট্য:

হ্যাশ র্যান্ডমাইজেশনের উদ্দেশ্য হ'ল সাবধানে-বাছাই করা ইনপুটগুলি যা কোনও ডিক নির্মাণের সবচেয়ে খারাপ ক্ষেত্রে পারফরম্যান্সকে কাজে লাগায় সেই কারণে অস্বীকৃত-পরিষেবা থেকে সুরক্ষা প্রদান করে is

পূর্ববর্তী সংস্করণগুলিতে ২.6.৮ থেকে আপনি কমান্ড লাইনে এটি-আর, বা পাইথনহ্যাসিডেড এনভায়রনমেন্ট বিকল্পের সাথে স্যুইচ করতে পারেন ।

আপনি এটি PYTHONHASHSEEDশূন্যে সেট করে বন্ধ করতে পারেন ।


-11

হ্যাশ () একটি পাইথন অন্তর্নির্মিত ফাংশন এবং এটি অবজেক্টের জন্য একটি হ্যাশ মান গণনা করতে ব্যবহার করে স্ট্রিং বা নম্বরের জন্য নয়, ।

আপনি এই পৃষ্ঠায় বিস্তারিত দেখতে পাবেন: https://docs.python.org/3.3/library/function.html#hash

এবং হ্যাশ () মানগুলি বস্তুর __hash__ পদ্ধতি থেকে আসে। ডক নিম্নলিখিতটি বলেছেন:

ডিফল্টরূপে, স্ট্র, বাইটস এবং ডেটটাইম অবজেক্টের হ্যাশ () মানগুলি একটি অনির্দেশ্য র্যান্ডম মান সহ "সল্টেড" হয়। যদিও তারা পৃথক পাইথন প্রক্রিয়াটির মধ্যে স্থির থাকে, পাইথনের বারবার আহ্বানের মধ্যে তারা অনুমানযোগ্য নয়।

এজন্য আপনার বিভিন্ন কনসোলে একই স্ট্রিংয়ের জন্য পৃথক হ্যাশ মান রয়েছে।

আপনি যা বাস্তবায়ন করেন তা ভাল উপায় নয়।

আপনি যখন একটি স্ট্রিং হ্যাশ মান গণনা করতে চান, কেবল হ্যাশলিব ব্যবহার করুন

হ্যাশ () এর উদ্দেশ্য হ'ল একটি বস্তুর হ্যাশ মান পাওয়া যায়, কোনও স্ট্র্যাং নয়।


6
hash()স্ট্রিং বা সংখ্যাগত মানগুলির জন্য পুরোপুরি বৈধ। আপনার সাথে এই বিভ্রান্তিকর হয় __hash__কাস্টম পদ্ধতি ব্যবহার দ্বারাhash() হ্যাশ মান একটি কাস্টম বাস্তবায়ন প্রদান।
মার্টিজন পিটারস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.