কেন স্টাড :: হ্যাশকে নির্বিচারক হওয়ার গ্যারান্টি দেওয়া হয়নি?


28

পরবর্তীতে , আমরা N4140 (সি ++ 14 স্ট্যান্ডার্ড) ব্যবহার করি


.6 17.6.3.4 হ্যাশ প্রয়োজনীয়তা অনুসারে ,

প্রত্যাশিত মানটি k প্রোগ্রামের সময়কালের জন্য কেবল যুক্তির উপর নির্ভর করবে ।

[দ্রষ্টব্য: সুতরাং প্রোগ্রামটির প্রদত্ত কার্যকরকরণের জন্য একই ফলনের h(k)জন্য একই মূল্য সহ অভিব্যক্তির সমস্ত মূল্যায়ন । - শেষ নোট]k

এবং .9 20.9.12 ক্লাস টেম্পলেট হ্যাশ বলে

...

ইনস্ট্যান্টেশন করা উচিত hash<Key>:

(1.1) - হ্যাশ প্রয়োজনীয়তা (17.6.3.4) পূরণ করুন ...

(1.2) - ...


এর অর্থ হ'ল একটি হ্যাশ মান value(অর্থাত্‍ hash<decltype(value)>(value)) যদি আপনি প্রোগ্রামটি পুনরায় চালু করেন তবে ভিন্ন মান নিতে পারে।

কিন্তু কেন? এই সীমাবদ্ধতাটি C ++ 11 এর স্ট্যান্ডার্ডে ছিল না, তবে C ++ 14, C ++ 17 এবং C ++ 20 এর স্ট্যান্ডার্ডে ছিল। একজন ব্যবহারকারী হিসাবে (কোনও এসটিএল বিকাশকারী নয়), যদি সংজ্ঞাবাদী হয় তবে এটি বেশ কার্যকর std::hashহবে। একটি ডিস্ট্রিমেন্টিক হ্যাশ ফাংশন বাস্তবায়নে কোনও গাণিতিক সমস্যা আছে? তবে হ্যাশ ফাংশন যা আমরা প্রতিদিন ব্যবহার করি (যেমন অবচয় md5sumবা নিরাপদ sha256) সেগুলি হ্রাসকারী deter দক্ষতার কোনও সমস্যা আছে?


7
"... হ্যাশ ফাংশনগুলি কেবলমাত্র কোনও প্রোগ্রামের একক প্রয়োগের মধ্যে একই ইনপুটটির জন্য একই ফলাফল তৈরি করতে হয় ; এটি লবণযুক্ত হ্যাশগুলিকে অনুমতি দেয় যা সংঘর্ষ অস্বীকৃত-পরিষেবা আক্রমণকে বাধা দেয় " " উত্স: en.cppreferences.com/w/cpp/utility/hash
রিচার্ড ক্রিটেন

5
এটি একটি ডিটারমিনিস্টিক অ্যালগরিদমকে অ-ডিটারমিনিস্টিক ইনপুট নিতে দেয়। উদাহরণস্বরূপ পয়েন্টারের মান। একটি অপরিবর্তনীয় ডেটা স্ট্রাকচার তার অভ্যন্তরীণ তথ্যগুলির ঠিকানাগুলি হ্যাশ করতে পারে, যা সামগ্রীগুলি হ্যাশ করার চেয়ে অনেক দ্রুত হতে পারে।
জন কুগেলম্যান

4
আপনি কেন স্থিরতা চান না এই কারণেই এই উত্তরের কয়েকটি দুর্দান্ত লিঙ্ক রয়েছে।
নাথান অলিভার

3
এটিকে সীমাবদ্ধতা হিসাবে হুমকি দেবেন না, তবে মানক বাধা কিছুটা কম কঠোর করুন।
মারেক আর

4
সীমাবদ্ধতাগুলি কেন আলগা হয়ে গেছে তার পুরো ব্যাখ্যা এখানে ।
মেরেক আর

উত্তর:


17

রানগুলির মধ্যে হিট ফাংশনটি নির্বিঘ্ন হওয়ার দরকার নেই, তবে আপনি এখনও নিজের হ্যাশ সরবরাহ করতে পারেন, যেমন আনর্ডারড কনটেইনারগুলির জন্য যদি এটি নির্ভর করে এমন কোনও আচরণ।

কারণ হিসাবে, cppreferences বলেছেন:

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

যদি Hashপ্রয়োজনীয়তাগুলি এটিকে নির্জনবাদী হতে বলে, তবে আপনি প্রয়োজনীয়তা ভঙ্গ না করে লবণযুক্ত হ্যাশ সরবরাহ করতে সক্ষম হবেন না।

কেন আসল ব্যাখ্যা এখানে


7

@ নাথানঅলিভার দ্বারা প্রস্তাবিত এই উত্তর (এবং এতে লিঙ্কগুলি) চূড়ান্তভাবে সহায়ক। আমাকে গুরুত্বপূর্ণ অংশগুলি উদ্ধৃত করি।

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

( ইস্যু 2291 থেকে। স্ট্যান্ড :: হ্যাশ সংঘর্ষে ডওস আক্রমণে ঝুঁকিপূর্ণ )

এই কারণে ভাষা ডিজাইনাররা এলোমেলোভাবে হ্যাশিংয়ে স্থানান্তরিত হচ্ছে। র্যান্ডম হ্যাশিংয়ের ক্ষেত্রে, "আপনার" স্ট্রিংয়ের হ্যাশ মানটি প্রতিবার আপনার প্রোগ্রামটি চালানোর সময় পরিবর্তিত হতে পারে। র্যান্ডম হ্যাশিং এখন পাইথন (সংস্করণ 3.3 অনুযায়ী), রুবি (সংস্করণ 1.9 হিসাবে) এবং পার্ল (সংস্করণ 5.18 হিসাবে) এ ডিফল্ট is

( আপনি কি বুঝতে পারেন যে আপনি এলোমেলো হ্যাশিং ব্যবহার করছেন? )

এমনকি অনুমতি প্রতিস্থাপনকারী আলোচনার ক্ষেত্রে বিতর্কিত হয়ে থাকায় তাত্ক্ষণিকের চেয়ে প্রস্তুত না হয়ে যান

( ইস্যু 2291 থেকে। স্ট্যান্ড :: হ্যাশ সংঘর্ষে ডওস আক্রমণে ঝুঁকিপূর্ণ )

অনুশীলনে, যতদূর আমি বুঝতে পেরেছি, std::hashপ্রয়োগের এলোমেলোভাবে কোনও র্যান্ডম হ্যাশিং প্রয়োগ করা হয়নি তবে আপনি নিজের লেখা লিখতে পারেন my::secure_hash

( এই উত্তর থেকে )


পুনশ্চ

আমি কেবল "হ্যাশ টেবিল ডস" গুগল করেছিলাম এবং একটি তথ্যবহুল পৃষ্ঠা পেয়েছি: যে মুহুর্তটি আপনি যখন বিশ্বের প্রতিটি সার্ভার উপলব্ধি করতে পারেন তখন এটি দুর্বল

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