একটি ভাল হ্যাশ ফাংশন কি?


130

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

function Hash(key)
  return key mod PrimeNumber
end

(মোড সি এবং অনুরূপ ভাষায়% অপারেটর)

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


34
আপনি কি নীচের সাধারণ উদ্দেশ্যে হ্যাশ ফাংশনগুলির একটি বা একাধিক ব্যবহার বিবেচনা করেছেন: partow.net/programming/hashfunitions/index.html

Fnv_func এ, পি [i] প্রকারটি চর, প্রথম পুনরাবৃত্তির পরে এইচ দিয়ে কী হবে? এটি উদ্দেশ্যমূলকভাবে করা হয়েছিল?

5
@martinatime বললঃ উইকিপিডিয়া হ্যাশ ফাংশন প্রায় তথ্য একটি গুচ্ছ নেই en.wikipedia.org/wiki/Hash_function এবং এই প্রবন্ধের নীচে partow.net/programming/hashfunctions/index.html আলগোরিদিম বিভিন্ন ভাষায় বাস্তবায়িত হয়েছে।
2501

উত্তর:


33

মূলত যে কোনও ধরণের ডেটাতে "নরমাল" হ্যাশ টেবিল লুকআপ করার জন্য - পল হিশিয়াহর লেখা এটি আমার মধ্যে সবচেয়ে ভাল ব্যবহার করা হয়েছে।

http://www.azillionmonkeys.com/qed/hash.html

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


তথ্যযুক্ত লিঙ্কের জন্য ধন্যবাদ! আমি জানি কয়েক যা বিন্দু বেশ ভাল বিশ্বজনীনভাবে গ্রহণযোগ্য হ্যাশ ফাংশন বব জেনকিন্স এবং অন্যদের বিশ্লেষণ কিন্তু আমি এই এক জুড়ে এখনও আসে নি।
কনরাড রুডল্ফ

আমি জেনকিন্সের সাইট থেকে পড়েছিলাম যে এসএফএইচ তখনকার অন্যতম সেরা, তবে আমি মনে করি যে মুরমার আরও ভাল করতে পারে, এই দুর্দান্ত উত্তরটি দেখুন: প্রোগ্রামার্স.স্ট্যাকেক্সচেঞ্জ
প্রশ্নগুলি

2
ওয়াইএমএমভি কী বোঝায়?
কোবারজান

3
@ কোবারজান আপনার মাইলেজ মেটাতে পারে
প্রোগ্রামারডান

2
Hsieh এর হ্যাশ ফাংশনটি ভয়াবহ, এর চেয়ে অনেক বেশি সংঘর্ষের অর্ডার সহ আমরা চাই। বিশেষত, কেবল শেষ 4 বাইটের মধ্যে পৃথক স্ট্রিংগুলি সহজেই সংঘর্ষে পড়তে পারে। আপনার যদি 30 টি অক্ষরের স্ট্রিং থাকে, যা শেষ 4 বাইটের সাথে পৃথক হয়, 28 বাইটগুলি প্রক্রিয়া করার পরে, হ্যাশগুলি শুধুমাত্র শেষ 2 বাইটে পৃথক হয়। তার মানে আপনি বাকী দু-বাইট মানের একটির সংঘর্ষের নিশ্চয়তা পেয়েছেন। (হ্যাঁ, এটি দ্রুত। সুতরাং কী।)
অ্যান্ড্রু লাজার

51

ইউনিভার্সাল হ্যাশগুলির জন্য "হ্যাড হ্যাশ ফাংশন" বলে কোনও জিনিস নেই (এড। হ্যাঁ, আমি জানি "ইউনিভার্সাল হ্যাশিং" এর মতো একটি জিনিস আছে তবে এটি আমি বোঝাতে চাইনি)। প্রসঙ্গের উপর নির্ভর করে বিভিন্ন মানদণ্ড একটি হ্যাশের গুণমান নির্ধারণ করে। দুই জন ইতিমধ্যে এসএএ-র উল্লেখ করেছেন। এটি একটি ক্রিপ্টোগ্রাফিক হ্যাশ এবং এটি সম্ভবত আপনি বোঝাতে চাইছেন এমন হ্যাশ টেবিলগুলির পক্ষে মোটেই ভাল নয়।

হ্যাশ টেবিলগুলির খুব আলাদা প্রয়োজনীয়তা রয়েছে। তবে এখনও, সার্বজনীনভাবে একটি ভাল হ্যাশ ফাংশন সন্ধান করা শক্ত কারণ বিভিন্ন উপাত্তের ধরণগুলি হ্যাশ হতে পারে এমন বিভিন্ন তথ্য প্রকাশ করে ose থাম্বের নিয়ম হিসাবে কোনও ধরণের সমানভাবে ধারণ করা সমস্ত তথ্য বিবেচনা করা ভাল । এটি সর্বদা সহজ বা এমনকি সম্ভব নয়। পরিসংখ্যানের কারণে (এবং এর ফলে সংঘর্ষের জন্য) সমস্যা স্পেস, অর্থাৎ সমস্ত সম্ভাব্য বস্তুগুলিতে একটি ভাল বিস্তার তৈরি করাও গুরুত্বপূর্ণ। এর অর্থ হ'ল 100 এবং 1050 এর মধ্যে সংখ্যার হ্যাশিংয়ের সময় সর্বাধিক উল্লেখযোগ্য অঙ্কটি হ্যাশটিতে একটি বড় ভূমিকা পালন করা ভাল নয় কারণ ~ 90% অবজেক্টের জন্য এই সংখ্যাটি 0 হবে the শেষ তিনটি দেওয়া আরও বেশি গুরুত্বপূর্ণ অঙ্কগুলি হ্যাশ নির্ধারণ করে।

একইভাবে, স্ট্রিংগুলি হ্যাশ করার সময় সমস্ত অক্ষর বিবেচনা করা জরুরী - যখন আগে থেকেই জানা যায় যে সমস্ত স্ট্রিংয়ের প্রথম তিনটি অক্ষর একই হবে; এগুলি বিবেচনা করা এখন অপব্যয়।

এটি প্রকৃতপক্ষে এমন একটি ক্ষেত্রে যেখানে আমি আর্ট অফ কম্পিউটার প্রোগ্রামিং , খন্ডে নুথের যা বলতে চাই তা পড়তে পরামর্শ দিই । ৩. আরেকটি ভাল পঠন হ'ল জুলিয়েন ওয়াকারের আর্ট অফ হ্যাশিং


1
কনরাড, আপনি অবশ্যই একটি তাত্ত্বিক দৃষ্টিকোণ থেকে সঠিক, তবে আপনি কি আমার মন্তব্যে উল্লিখিত পল হিশিয়াহ হ্যাশ ফাংশনটি ব্যবহার করার চেষ্টা করেছেন? এটি বিভিন্ন ধরণের ডেটার বিপক্ষে সত্যই বেশ ভাল!
ক্রিস হ্যারিস

9

হ্যাশিং ফাংশনগুলির দুটি প্রধান উদ্দেশ্য রয়েছে:

  • একসাথে ডেটা পয়েন্টগুলি বি বিতে ছড়িয়ে দিতে।
  • নিরাপদে ইনপুট ডেটা সনাক্ত করতে।

আপনি কী ব্যবহার করছেন তা না জেনে একটি হ্যাশ প্রস্তাব দেওয়া অসম্ভব।

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

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


হ্যাশ ফাংশন লাউঞ্জে আপডেট হওয়া লিঙ্ক: larc.usp.br/~pbarreto/hflounge.html
টিম

এফএনভি জন্মদিনের সংঘর্ষের সাথে তুলনামূলকভাবে কতটা সহ্য করতে পারে, বলুন, কোনও এসএএএ 1 ছাড়াই একই সংখ্যক বিট?
কেভিন হু

@ কেভিন যতক্ষণ না হ্যাশের অ্যাভালঞ্চ বৈশিষ্ট্যগুলি ভাল থাকে (ইনপুট-এ ছোট পরিবর্তন = আউটপুটে বড় পরিবর্তন) তারপরে জন্মদিনের সংঘর্ষগুলি হ্যাশের বিটের একটি কার্যকারিতা। এফএনভি -১ এ এক্ষেত্রে দুর্দান্ত, এবং আপনি হ্যাশটিতে যতগুলি বা কয়েকটি বিট চান তা পেতে পারেন (যদিও এটি 2 এর শক্তি নয় এমন একটি বিট গণনা পেতে কিছুটা অতিরিক্ত প্রচেষ্টা প্রয়োজন)।
মায়ার্ডিন এমরিস

5

এটি একটি ভাল একটি উদাহরণ এবং আপনি কেন কখনই এটি লিখতে চান না তার একটি উদাহরণ। এটি একটি ফোলার / নোল / ভো (এফএনভি) হ্যাশ যা সমান অংশ কম্পিউটার বিজ্ঞানের প্রতিভা এবং খাঁটি ভুডো:

unsigned fnv_hash_1a_32 ( void *key, int len ) {
    unsigned char *p = key;
    unsigned h = 0x811c9dc5;
    int i;

    for ( i = 0; i < len; i++ )
      h = ( h ^ p[i] ) * 0x01000193;

   return h;
}

unsigned long long fnv_hash_1a_64 ( void *key, int len ) {
    unsigned char *p = key;
    unsigned long long h = 0xcbf29ce484222325ULL;
    int i;

    for ( i = 0; i < len; i++ )
      h = ( h ^ p[i] ) * 0x100000001b3ULL;

   return h;
}

সম্পাদনা:

  • ল্যান্ডন কার্ট নল তার সাইটে FVN-1A অ্যালগরিদমকে মূল FVN-1 অ্যালগরিদমের চেয়ে সুপারিশ করেছেন: উন্নত অ্যালগরিদম হ্যাশের শেষ বাইটটি আরও ভালভাবে ছড়িয়ে দেয়। আমি সেই অনুযায়ী অ্যালগরিদম সামঞ্জস্য করেছি।

3
এই মানগুলি কেন বেছে নেওয়া হয়েছে সে সম্পর্কে আপনি কিছু তথ্যের জন্য এই সাইটটি দেখতে চাইতে পারেন: isthe.com/chongo/tech/comp/fnv/#fnv-prime
Cthutu

তোমার মঙ্গল হোক. এই সংক্ষিপ্ত, সহজ, দক্ষ, জেনেরিক এবং কার্যকর -৪-বিট হ্যাশ ফাংশনটি আমার প্রয়োজন মতো ছিল।
মত্তারোদ

3

আমি বলব যে থাম্বের প্রধান নিয়মটি আপনার নিজের রোল না। এমন কিছু ব্যবহার করার চেষ্টা করুন যা পুরোপুরি পরীক্ষা করা হয়েছে, যেমন, SHA-1 বা সেই লাইনের পাশাপাশি কিছু।


তাকে ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত কোনও কিছুর প্রয়োজন বলে মনে হচ্ছে না যাতে SHA-1 ওয়ে ওভারকিল হবে।
এরিক

যাইহোক, যদিও SHA-1 এর জন্য কোনও সংঘর্ষের সন্ধান পাওয়া যায় নি এটি বিশ্বাস করা যে এটির সন্ধান পাওয়ার কয়েক বছর বা মাসের ব্যাপার। আমি SHA-256 ব্যবহার করার পরামর্শ দেব।
স্যামুয়েল অ্যালান

1

একটি ভাল হ্যাশ ফাংশন নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

  1. কোনও বার্তার একটি হ্যাশ দেওয়া কোনও আক্রমণকারীর পক্ষে অন্য কোনও বার্তা এমনভাবে পাওয়া যায় যে তাদের হ্যাশগুলি অভিন্ন comp

  2. এম এবং এম এর একজোড়া বার্তা দেওয়া, এইচ (এম) = এইচ (এম ') এর মতো দুটি সন্ধান করা গণনার পক্ষে অনিবার্য

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

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

নতুন ডিজাইনে MD5 বা SHA-1 ব্যবহার করবেন না। আমার অন্তর্ভুক্ত বেশিরভাগ ক্রিপ্টোগ্রাফার তাদের ভাঙ্গা বিবেচনা করবেন। এই উভয় ডিজাইনের দুর্বলতার মূল উত্স হ'ল দ্বিতীয় সম্পত্তি, যা আমি উপরে উল্লেখ করেছি, এই নির্মাণগুলির জন্য ধারণ করে না। যদি কোনও আক্রমণকারী মি এবং এম 'দুটি বার্তা উত্পন্ন করতে পারে তবে উভয়ই হ্যাশ একই মান হিসাবে তারা আপনার বিরুদ্ধে এই বার্তাগুলি ব্যবহার করতে পারে। SHA-1 এবং MD5 বার্তা বর্ধনের আক্রমণেও ভুগছে, যদি আপনি যত্নবান না হন তবে আপনার অ্যাপ্লিকেশনটিকে মারাত্মকভাবে দুর্বল করতে পারে।

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

আশা করি এইটি কাজ করবে!


1
আমি মনে করি ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনের সুপারিশ করা এই ক্ষেত্রে সত্যই খারাপ পরামর্শ।
স্লাভা

@ স্লাভা: কেন? "ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন এই ক্ষেত্রে সত্যই খারাপ পরামর্শ বলে বলার জন্য আপনার কারণগুলি কী?" এটা খারাপ পরামর্শ কেন? এটির তুলনামূলক অসুবিধাগুলি কী?
আমাকে এটিকে সম্পর্কে

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

1

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

1) একটি আইভি। খিচিনের ধ্রুবক বা এরকম কিছু এর প্রথম 256 বিট বিভক্ত অংশ ব্যবহার করার চেষ্টা করুন। 2) একটি প্যাডিং প্রকল্প আছে। সহজ। MD5 বা SHA-3 এর মতো একটি হ্যাশ থেকে এটিকে ব্যারো করুন (কেকক [উচ্চারণিত 'কেট-চক'])। আপনি যদি সুরক্ষা সম্পর্কে কিছু চিন্তা করেন না (অন্য কয়েকজন এটি বলেছিল), বব জেনকিন্স দ্বারা এফএনভি বা লুক 2 দেখুন (আসলে আমি প্রথম যারা লুকে দেখা 2) )।

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