কেন হ্যাশ ফাংশনগুলিতে একটি মৌলিক সংখ্যা মডুলাস ব্যবহার করা উচিত?


335

অনেক দিন আগে, আমি দর কষাকষির টেবিলের বাইরে data 1.25 এর জন্য একটি ডেটা স্ট্রাকচার বই কিনেছিলাম। এতে, একটি হ্যাশিং ফাংশনের ব্যাখ্যাটি বলেছিল যে "গণিতের প্রকৃতি" বলে এটি শেষ পর্যন্ত একটি মৌলিক সংখ্যার দ্বারা মোড করা উচিত।

আপনি $ 1.25 এর বই থেকে কী আশা করবেন?

যাইহোক, গণিতের প্রকৃতি সম্পর্কে চিন্তা করার জন্য আমার অনেক বছর ছিল, এবং এখনও তা বের করতে পারি না।

বালতিগুলির একটি প্রাথমিক সংখ্যা থাকা সত্ত্বেও কি সংখ্যার বন্টন সত্যই বেশি হয়? অথবা এই যে প্রত্যেকের গ্রহণ কারণ সবাই একটি পুরানো প্রোগ্রামার এর গল্প হয় আর এটিকে স্বীকার করলে?


1
পুরোপুরি যুক্তিসঙ্গত প্রশ্ন: কেন বালতিগুলির একটি প্রাথমিক সংখ্যা থাকা উচিত?
ড্রয়মন

1
এই প্রশ্নটি অফ-টপিক হিসাবে উপস্থিত বলে মনে হচ্ছে কারণ এটি সম্ভবত কম্পিউটার সায়েন্সের সাথে সম্পর্কিত
অরবিট

2
cs.stackexchange.com/a/64191/64222 আরেকটি ভাল যুক্তিতে তর্ক করেছেন।
সবুজ গাছ


এখানে কিছু বিস্ময়কর সাক্ষ্যগত সংখ্যার একটি কিছুটা সংশ্লিষ্ট প্রশ্নের অন্য মহান ব্যাখ্যা নেই - quora.com/...
AnBisw

উত্তর:


242

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

(first char) + k * (second char) + k^2 * (third char) + ...

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

[উদাহরণস্বরূপ, জাভার স্ট্রিং হ্যাশকোড এর সাথে চূড়ান্তভাবে অনুরূপ - এটি কে = 31 দিয়ে অক্ষরগুলি বিপরীত ক্রম করে। সুতরাং আপনি একই স্ট্রিংগুলির মধ্যে 31 স্ট্রাইকগুলির মধ্যে স্ট্রাইকিং মডিউলগুলি পান এবং স্ট্রাইকিং রিলেশনগুলি 2 ^ 32 এর শেষের ব্যতীত একই স্ট্রিংগুলির মধ্যে মডিউল হয়। এটি হ্যাশটেবল আচরণকে গুরুতরভাবে বিশৃঙ্খলা করে না]]

বালিশের সংখ্যার উপরে হ্যাশটির মডুলাস গ্রহণ করে একটি হ্যাশটেবল কাজ করে।

সংঘর্ষগুলি হ্যাশটেবলের কার্যকারিতা হ্রাস করার কারণে সম্ভাব্য মামলার জন্য সংঘর্ষ উত্পাদন না করার জন্য হ্যাশটেবলে এটি গুরুত্বপূর্ণ।

এখন, ধরুন যে কেউ একটি সম্পূর্ণ গুচ্ছ মানকে একটি হ্যাশটেবলে রাখে যা আইটেমগুলির মধ্যে কিছুটা সম্পর্ক রাখে, যেমন সবার প্রথম চরিত্রের মতো। এটি একটি মোটামুটি অনুমানযোগ্য ব্যবহারের ধরণ, আমি বলব, তাই আমরা এটি খুব বেশি সংঘর্ষের সৃষ্টি করতে চাই না।

দেখা যাচ্ছে যে "গণিতের প্রকৃতির কারণে", যদি হ্যাশে ধ্রুবক ব্যবহৃত হয়, এবং বালতিগুলির সংখ্যা কপিরাইট হয় তবে কয়েকটি সাধারণ ক্ষেত্রে সংঘর্ষগুলি হ্রাস করা হয়। তারা কপিরাইট না হলে, তবে ইনপুটগুলির মধ্যে কিছু মোটামুটি সহজ সম্পর্ক রয়েছে যার জন্য সংঘর্ষগুলি হ্রাস করা হয় না। সমস্ত হ্যাশগুলি সমান মডিউলগুলি সাধারণ ফ্যাক্টর থেকে বেরিয়ে আসে, যার অর্থ তারা সকলেই বালতিগুলির 1 / n ম অংশে পড়বে যার মানটি সাধারণ ফ্যাক্টরটি করে। আপনি অনেকগুলি সংঘর্ষের চেয়ে n গুন পাবেন, যেখানে n সাধারণ কারণ। যেহেতু এন কমপক্ষে 2, তাই আমি বলতে পারি যে এটি মোটামুটি সাধারণ ব্যবহারের ক্ষেত্রে কমপক্ষে দ্বিগুণ সংখ্যক সংঘর্ষের তুলনায় স্বাভাবিক হিসাবে গ্রহণযোগ্য। যদি কিছু ব্যবহারকারী আমাদের বালতিগুলিতে বিতরণ ভাঙতে চলেছে তবে আমরা এটি একটি অদ্ভুত দুর্ঘটনা হয়ে উঠতে চাই, কিছু সাধারণ অনুমানযোগ্য ব্যবহার নয়।

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

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

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

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

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


HashCodes জন্য ফ্যাক্টর তৈরির জন্য একটি কে যুক্তিসম্মত পছন্দ জন্য একটি আলোচনা এখানে:: শুধু একটি সাইড নোট হিসাবে stackoverflow.com/q/1835976/21499
হান্স-পিটার Störr

9
এটি একটি দুর্দান্ত উত্তর। আপনি দয়া করে এটিকে আরও ব্যাখ্যা করতে পারেন "সুতরাং আপনি একইভাবে শেষ হওয়া স্ট্রিংগুলির মধ্যে স্ট্রাইকিং সম্পর্কগুলি 31 মডিউল পান এবং শেষের কাছাকাছি ব্যতীত একই স্ট্রিংগুলির মধ্যে 2। 32 স্ট্রাইকিং রিলেশনগুলি পাবেন This এটি হ্যাশটেবল আচরণকে গুরুতরভাবে গণ্ডগোল করে না। " আমি বিশেষত 2 ^ 32 অংশটি বুঝতে পারি না
সাধারণ

2
বিষয়গুলি সম্পর্কে আরও পরিষ্কার করার জন্য অতিরিক্ত নোট: "সমস্ত হ্যাশগুলি সমান মডিউলগুলি সাধারণ ফ্যাক্টর থেকে বেরিয়ে আসে" -> এটি কারণ, যদি আপনি উদাহরণটিকে হ্যাশ ফাংশন হ্যাশ = 1 ম চর + ২ য় চর * কে + ... বিবেচনা করেন, এবং একই প্রথম অক্ষরের সাথে স্ট্রিং নিন, হ্যাশ% কে এই স্ট্রিংগুলির জন্য একই হবে। যদি এম হ্যাশটেবলের আকার হয় এবং জি এম এবং কে এর জিসিডি হয়, তবে (হ্যাশ% কে)% জি হ্যাশ% জি সমান (যেহেতু জি কে বিভাজক করে) এবং সুতরাং হ্যাশ% জিও এই স্ট্রিংগুলির জন্য একই হবে। এখন বিবেচনা করুন (হ্যাশ% এম)% জি, এটি হ্যাশ% জি সমান (যেহেতু জি এম ভাগ করে)। সুতরাং (হ্যাশ% এম)% জি এই সমস্ত স্ট্রিংয়ের জন্য সমান।
কোয়ার্ক

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

1
@ স্টেভ জেসোপ, দয়া করে আপনি "শেষের কাছাকাছি বাদে একই রকমের স্ট্রিংগুলির মধ্যে স্ট্রাইকিং রিলেশনস মডিউল 2 ^ 32 ব্যাখ্যা করতে পারেন?" ধন্যবাদ।
খান্না 111

29

হ্যাশ টেবিল থেকে সন্নিবেশ / পুনরুদ্ধার করার সময় আপনি প্রথমে যা করছেন তা হল প্রদত্ত কীটির জন্য হ্যাশকোড গণনা করা এবং তারপরে হ্যাশকোড% টেবিল-দৈর্ঘ্য দ্বারা হ্যাশটবেলের আকারে ছাঁটাই করে সঠিক বালতিটি সন্ধান করুন। এখানে 2 'বিবৃতি' দেওয়া হয়েছে যা আপনি সম্ভবত কোথাও পড়েছেন

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

এবং এখানে প্রমাণ।

যদি ধরুন আপনার হ্যাশকোড ফাংশনটির ফলাফল অন্যদের মধ্যে নীচের হ্যাশকোডের মধ্যে রয়েছে {x, 2x, 3x, 4x, 5x, 6x ...}, তবে এই সমস্তগুলি কেবল মি সংখ্যক বালতিতে ক্লাস্টার হতে চলেছে, যেখানে এম = টেবিল_লাইনেটি / গ্রেটেস্টকমোন ফ্যাক্টর (টেবিল_ দৈর্ঘ্য, এক্স) (এটি যাচাই / আবিষ্কার করা তুচ্ছ)) ক্লাস্টারিং এড়াতে এখন আপনি নিম্নলিখিতগুলির মধ্যে একটি করতে পারেন

আপনি যে অনেক বেশি হ্যাশকোড তৈরি করতে পারবেন না তা নিশ্চিত করুন যে has x, 2x, 3x, 4x, 5x, 6x ... in এর মতো অন্য হ্যাশকোডের গুণক But লক্ষ লক্ষ এন্ট্রি। অথবা কেবল গ্রেটেস্টকমনফ্যাক্টর (টেবিল_ দৈর্ঘ্য, এক্স) এর 1 এর সমান, অর্থাৎ x দিয়ে টেবিল_ দৈর্ঘ্যের কপিরাইট তৈরি করে মি। এবং যদি এক্স কোনও সংখ্যার প্রায় হতে পারে তবে নিশ্চিত করুন যে টেবিল_ দৈর্ঘ্য একটি প্রাথমিক সংখ্যা।

থেকে - http://srinvis.blogspot.com/2006/07/hash-table-lengths- এবং-prime - numbers.html


11

http://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/

খুব স্পষ্ট ব্যাখ্যা, ছবি সহ।

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

আরও ভাল প্রশ্ন হবে 31 নম্বর ঠিক কেন?


5
যদিও, আমি মনে করি একটি সংক্ষিপ্তসার সহায়ক হবে, যদি সেই সাইটটি কখনও মারা যায় তবে এর সামগ্রীর কিছু অংশ এখানে এসওতে সংরক্ষণ করা হবে।
থমাস ওভেনস

2
আর্টিকেলটি কেন তা ব্যাখ্যা করে না, তবে বলেছে "গবেষকরা দেখেছেন যে ৩১ এর প্রাইম ব্যবহার করা কীগুলিতে আরও ভাল বিতরণ দেয় এবং সংঘর্ষের সংখ্যা কম হয় why কেন কেউ জানে না ..." মজার, কার্যকরভাবে আমার মতো একই প্রশ্ন জিজ্ঞাসা করছেন ।
থিশচিটজার

> আরও ভাল প্রশ্ন হবে 31 নম্বর ঠিক কেন? যদি আপনি বোঝাচ্ছেন যে কেন 31 সংখ্যাটি ব্যবহার করা হয় তবে আপনি যে নিবন্ধটি নির্দেশ করেছেন সেটি আপনাকে কেন তা বোঝায়, কারণ এটি একাধিক দ্রুত এবং কোস পরীক্ষাগুলি দেখায় যে এটি ব্যবহার করা সবচেয়ে ভাল। অন্যান্য জনপ্রিয় গুণকটি আমি দেখেছি 33 যা তত্ত্বটিকে ওজন দেয় যে গতি ইস্যুটি (অন্তত প্রাথমিকভাবে) একটি গুরুত্বপূর্ণ কারণ ছিল। যদি আপনার অর্থ হয়, এটি 31 সম্পর্কে কী যা পরীক্ষাগুলিতে এটি আরও ভাল করে তোলে তবে আমি ভয় করি যে আমি জানি না।
শেগমুর

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

3
@ স্টেভজেসপ সিপিইউ দ্বারা 31 নম্বরটি সহজেই একটি (x * 32) -1 অপারেশন হিসাবে অনুকূলিত করা হয়েছে, এতে *32একটি সরল বিট শিফট বা আরও ভাল একটি তাত্ক্ষণিক ঠিকানা স্কেল ফ্যাক্টর (যেমন lea eax,eax*8; leax, eax,eax*4x86 / x64) on সুতরাং *31মৌলিক সংখ্যা গুণ একজন ভাল প্রার্থী হয়। এটি বেশ কয়েক বছর আগে সত্য ছিল - এখনকার সিপিইউ আর্কিটেকচারের প্রায় তাত্ক্ষণিক গুণ রয়েছে - বিভাগটি সবসময় ধীর হয় ...
আর্নাড বোচেজ

10

TL; ড

index[hash(input)%2]সমস্ত সম্ভাব্য হ্যাশগুলির অর্ধেকের জন্য একটি সংঘর্ষ এবং মানগুলির একটি ব্যাপ্তির ফলাফল হবে। index[hash(input)%prime]সমস্ত সম্ভাব্য হ্যাশগুলির <2 এর সংঘর্ষে ফলাফল। টেবিলের আকারে বিভাজক স্থির করে তাও নিশ্চিত করে যে সংখ্যাটি টেবিলের চেয়ে বেশি হতে পারে না।


1
2 একটি প্রাইম নাম্বার ড্যুড
গণেশ চৌধারি সদনালা

8

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


1
যদিও ব্যাখ্যাটি এখন সুস্পষ্ট বলে মনে হচ্ছে, এ। শেন "প্রোগ্রামিং: উপপাদ্য এবং সমস্যাগুলি" (রাশিয়ান) এর একটি বই পড়ার পরে এটি আমার কাছে পেয়েছিল, রবিন অ্যালগরিদমের আলোচনা দেখুন। কোনও ইংরেজি অনুবাদ বিদ্যমান কিনা তা নিশ্চিত নয়।
TT_

5

এই সাইটটিতে কেবল বিকল্প দৃষ্টিভঙ্গি সরবরাহ করতে:

http://www.codexon.com/posts/hash-functions-the-modulo-prime-myth

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


বড় সংখ্যক বালতি মানে কম সংঘর্ষ: কবুতরের নীতিটি দেখুন।
অজানা

11
@ অজানা: আমি বিশ্বাস করি না যে এটি সত্য। দয়া করে আমি ভুল হলে আমাকে সংশোধন করুন, তবে আমি বিশ্বাস করি যে কবুতর হোলের নীতিটি হ্যাশ টেবিলগুলিতে প্রয়োগ করা কেবলমাত্র আপনাকেই দৃsert়ভাবে জানাতে দেয় যে যদি আপনার কাছে বিনের চেয়ে আরও বেশি উপাদান থাকে তবে সংঘর্ষের পরিমাণ বা ঘনত্বের বিষয়ে কোনও সিদ্ধান্ত নেওয়া না। আমি এখনও বিশ্বাস করি যে বৃহত্তর সংখ্যক সংখ্যক হ'ল সঠিক রুট।
ফালাইনা

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

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

মূল নিবন্ধটি শেষ হয়ে গেছে বলে মনে হচ্ছে তবে এখানে মূল লেখকের সাথে আলোচনা সহ কিছু অন্তর্দৃষ্টিপূর্ণ মন্তব্য রয়েছে। news.ycombinator.com/item?id=650487
অ্যাড্রিয়ান ম্যাককার্টি

3

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

একটি স্ট্রিং "স্যামুয়েল" দেওয়া, আপনি প্রতিটি মৌলিক সংখ্যার সাথে একটি মৌলিক সংখ্যার সাথে অক্ষর বা সংখ্যার যোগ করে একটি অনন্য হ্যাশ তৈরি করতে পারেন। এজন্য প্রাইম ব্যবহার করা হয়।

তবে প্রাইম ব্যবহার করা একটি পুরানো কৌশল। এখানে কীটি বোঝার জন্য যতক্ষণ আপনি পর্যাপ্ত অনন্য কী তৈরি করতে পারবেন ততক্ষণ আপনি অন্যান্য হ্যাশিং কৌশলগুলিতেও যেতে পারেন। Http://www.azillionmonkeys.com/qed/hash.html সম্পর্কে এই বিষয়ে আরও তথ্যের জন্য এখানে যান

http://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/


1
হাহাহাহাহ .... আসলে প্রাইম এবং অন্য কোনও সংখ্যার চেয়ে 2 প্রাইমের প্রোডাক্টের 'অনন্য' হওয়ার ভাল সম্ভাবনা কি নেই?
হাসানিএইচ

@ বেসকা এখানে "স্বতন্ত্রতা" পুনরাবৃত্তভাবে সংজ্ঞায়িত করা হয়েছে, তাই আমি বিশ্বাস করি যে "অদ্বিতীয়তাকে" একইভাবে সংজ্ঞায়িত করা উচিত :)
TT_

3

এটি হ্যাশ ফাংশন নির্বাচনের উপর নির্ভর করে।

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

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

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


2

ধরুন আপনার টেবিল-আকার (বা মডুলোর জন্য সংখ্যা) টি = (বি * সি)। এখন যদি আপনার ইনপুটটির জন্য হ্যাশ (N * A * B) এর মতো হয় যেখানে এন যে কোনও পূর্ণসংখ্যার হতে পারে তবে আপনার আউটপুটটি ভাল বিতরণ করা হবে না। কারণ প্রতিবার এন সি, 2 সি, 3 সি ইত্যাদি হয়ে যায়, আপনার আউটপুট পুনরাবৃত্তি শুরু হবে। অর্থাৎ আপনার আউটপুট কেবল সি পজিশনে বিতরণ করা হবে। দ্রষ্টব্য যে এখানে সি (টি / এইচসিএফ (টেবিল-আকার, হ্যাশ)) রয়েছে।

এইচসিএফ তৈরি করে এই সমস্যাটি নির্মূল করা সম্ভব Prime এর জন্য প্রাইম সংখ্যাগুলি খুব ভাল।

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

একইভাবে, 10 ^ N হিসাবে টি হিসাবে একই জাতীয় কারণ খারাপ (বাইনারি পরিবর্তে সংখ্যার দশমিক স্বীকৃতিতে প্যাটার্ন)।

সুতরাং, প্রাথমিক সংখ্যাগুলি আরও ভাল বিতরণ ফলাফল দেয়, তাই সারণির আকারের জন্য ভাল পছন্দ।


2

আমার অন্যান্য উত্তর থেকে অনুলিপি https://stackoverflow.com/a/43126969/917428 । আরও বিশদ এবং উদাহরণের জন্য এটি দেখুন।

আমি বিশ্বাস করি যে এটি কেবল কম্পিউটার 2 বেসে কাজ করে এমনটি করার সাথে সম্পর্কযুক্ত যা কেবল একই বেস 10 এর জন্য কীভাবে কাজ করে তা ভেবে দেখুন:

  • 8% 10 = 8
  • 18% 10 = 8
  • 87865378% 10 = 8

সংখ্যাটি কী তা বিবেচনাধীন নয়: যতক্ষণ এটি 8 দিয়ে শেষ হয় ততক্ষণ এর মডুলো 8 হবে 8।

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


1

আমি স্টিভ জেসপের উত্তরের জন্য কিছু যুক্ত করতে চাই (আমার যথেষ্ট খ্যাতি নেই বলে আমি এটি নিয়ে মন্তব্য করতে পারি না)। তবে আমি কিছু সহায়ক উপাদান পেয়েছি। তার উত্তরটি খুব সাহায্যকারী তবে তিনি একটি ভুল করেছেন: বালতির আকার 2 হওয়া উচিত না I'll

বিভাগ পদ্ধতিটি ব্যবহার করার সময়, আমরা সাধারণত এম এর নির্দিষ্ট মানগুলি এড়িয়ে চলি। উদাহরণস্বরূপ, মি 2 এর শক্তি হওয়া উচিত নয়, যেহেতু যদি মি = 2 ^ পি হয় তবে h (কে) কেবল পি এর সর্বনিম্ন-ক্রমের বিট হয়। যতক্ষণ না আমরা জানি যে সমস্ত নিম্ন-অর্ডার পি-বিট নিদর্শনগুলি সমানভাবে সম্ভাবনা রয়েছে, আমরা কী এর সমস্ত বিটের উপর নির্ভর করতে হ্যাশ ফাংশনটি ডিজাইন করা থেকে ভাল। যেমন 11.3-3 অনুশীলন আপনাকে দেখাতে বলেছে, m = 2 ^ p-1 বেছে নেওয়া যখন কে-র একটি রেখাংশ স্ট্রিং থাকে তখন 2 rad পি র‍্যাডিক্সে ব্যাখ্যা করা হয়, কারণ কে এর অক্ষরকে অনুমতি দেওয়া তার হ্যাশটির মান পরিবর্তন করে না।

আশা করি এটা সাহায্য করবে.


0

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

: আপনি একটি সমীকরণ আছে বলুন (x + y*z) % key = xসঙ্গে 0<x<keyএবং 0<z<key। কীটি যদি প্রথমটি হয় তবে এন * y = কীটি এন এর প্রতিটি এন এর জন্য সত্য এবং অন্য প্রতিটি সংখ্যার জন্য মিথ্যা।

একটি উদাহরণ যেখানে কীটি মূল উদাহরণ নয়: x = 1, z = 2 এবং কী = 8 কারণ কী / জেড = 4 এখনও একটি প্রাকৃতিক সংখ্যা, 4 আমাদের সমীকরণের সমাধান হয়ে যায় এবং এই ক্ষেত্রে (এন / 2) * y = কী এন এর প্রতিটি এন এর জন্য সত্য the সমীকরণের জন্য সমাধানগুলির পরিমাণ ক্রমান্বয়ে দ্বিগুণ হয়েছে কারণ 8 টি প্রাইম নয়।

যদি আমাদের আক্রমণকারী ইতোমধ্যে জেনে থাকে যে সমীকরণের জন্য 8 টি সম্ভাব্য সমাধান হ'ল তিনি ফাইলটি 8 থেকে 4 উত্পাদন করে পরিবর্তন করতে পারেন এবং এখনও একই হ্যাশ পান।


0

আমি উপরের কয়েকটি জনপ্রিয় উত্তরের সাথে লিঙ্কিত জনপ্রিয় ওয়ার্ডপ্রেস ওয়েবসাইটটি পড়েছি। আমি যা বুঝতে পেরেছি সেখান থেকে আমি একটি সাধারণ পর্যবেক্ষণ ভাগ করে নিতে চাই।

আপনি এখানে নিবন্ধে সমস্ত বিবরণ সন্ধান করতে পারেন , তবে নিম্নলিখিতটি সত্য বলে ধরেছেন:

  • একটি মৌলিক সংখ্যা ব্যবহার করা আমাদের একটি অনন্য মানের "সেরা সুযোগ" দেয়

একটি সাধারণ হ্যাশম্যাপ বাস্তবায়ন 2 টি জিনিস অনন্য হতে চায়।

  • কীটির জন্য স্বতন্ত্র হ্যাশ কোড
  • আসল মান সংরক্ষণ করার জন্য অনন্য সূচক

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

উদাহরণ:

কী = "কী"

মান = "মান" uniqueId = "k" * 31 ^ 2 + "e" * 31 ^ 1` + "y"

অনন্য আইডি মানচিত্র

এখন আমরা আমাদের মূল্যের জন্য একটি অনন্য অবস্থান চাই - তাই আমরা

uniqueId % internalContainerSize == uniqueLocationForValue, ধরে নেওয়াও internalContainerSizeএকটি প্রাথমিক।

আমি জানি এটি সরল, তবে আমি সাধারণ ধারণাটি পাওয়ার আশা করছি।


0

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

প্রধান মডুলি সুবিধাজনক কারণ:

  • তারা সেকেন্ডারি হ্যাশিংয়ে গৌণ গুণক নির্বাচন করার সময় সর্বাধিক স্বাধীনতা দেয়, 0 ব্যতীত সমস্ত গুণকগুলি একবারে সমস্ত উপাদান পরিদর্শন করে শেষ হবে
  • সমস্ত হ্যাশগুলি মডুলাসের চেয়ে কম হলে কোনও সংঘর্ষ হবে না
  • দুটি মডুলির পাওয়ার চেয়ে র্যান্ডম প্রাইমগুলি আরও ভালভাবে মিশ্রিত হয় এবং কেবলমাত্র একটি উপসেট নয় সমস্ত বিটের তথ্য সংকুচিত করে

তবে তাদের বড় ক্ষতি হচ্ছে, তাদের একটি পূর্ণসংখ্যা বিভাগ প্রয়োজন, যা অনেকগুলি ((15-40) চক্র এমনকি একটি আধুনিক সিপিইউতে লাগে takes প্রায় অর্ধেক গণনা সহ কেউ নিশ্চিত করতে পারেন যে হ্যাশ খুব ভালভাবে মিশ্রিত হয়েছে। দুটি গুণ এবং xorshift ক্রিয়াকলাপ একটি মৌলিক শৈশব তুলনায় ভাল মিশ্রিত হবে। তারপরে আমরা হ্যাশ টেবিলের আকার এবং হ্যাশ হ্রাস যা দ্রুত হয় তা ব্যবহার করতে পারি, 2 টি টেবিল আকারের পাওয়ারের জন্য মোট 7 টি অপারেশন দেয় এবং স্বেচ্ছাসেবী আকারের জন্য প্রায় 9 টি অপারেশন দেয়।

আমি সম্প্রতি দ্রুততম হ্যাশ টেবিল বাস্তবায়নের অনেকগুলি দেখেছি এবং তাদের বেশিরভাগই প্রাইম মডুলি ব্যবহার করে না।


0

এই প্রশ্নটি আরও উপযুক্ত প্রশ্নের সাথে একত্রীকরণ করা হয়েছিল, কেন হ্যাশ টেবিলগুলি প্রধান মাপের অ্যারেগুলি ব্যবহার করতে হবে, এবং ২ এর শক্তি নয় has গ্লিবিসি-র মতো, প্রধান আকারের অ্যারেগুলি ব্যবহার করুন, এখনও কিছুই নেই none

সাধারণত 2 টেবিলের শক্তি অনেক দ্রুত হয়। ব্যয়বহুল h % n => h & bitmask, যেখানে বিটমাস্কটি clzn এর আকারের ("গণনা নেতৃস্থানীয় শূন্যগুলি") মাধ্যমে গণনা করা যায়। একটি মডুলো ফাংশনটির পূর্ণসংখ্যা বিভাগ করা দরকার যা যৌক্তিকের চেয়ে প্রায় 50x কম and। কোনও মডুলো এড়াতে কিছু কৌশল রয়েছে যেমন লেমিরের https://lemire.me/blog/2016/06/27/a-fast-al متبادل-to-the-modulo-reduction/ ব্যবহার করে তবে সাধারণত দ্রুত হ্যাশ টেবিলগুলি শক্তি ব্যবহার করে 2 এর এবং সুরক্ষিত হ্যাশ টেবিলগুলি প্রাইম ব্যবহার করে।

কেন এমন?

এই ক্ষেত্রে সুরক্ষা সংঘর্ষের সমাধানের কৌশলটিতে আক্রমণ দ্বারা সংজ্ঞায়িত করা হয়েছে, যা বেশিরভাগ হ্যাশ টেবিলের সাথে সংঘর্ষের লিঙ্কযুক্ত তালিকায় কেবল লিনিয়ার অনুসন্ধান রয়েছে search অথবা দ্রুত খোলা-ঠিকানা সম্বোধনের টেবিলগুলির সাথে সরাসরি টেবিলের লিনিয়ার অনুসন্ধান। সুতরাং 2 টি টেবিলের শক্তি এবং টেবিলের কিছু অভ্যন্তরীণ জ্ঞান, উদাহরণস্বরূপ আকার এবং কিছু জেএসএন ইন্টারফেসের দ্বারা সরবরাহিত কীগুলির তালিকার ক্রমের সাথে আপনি ডান বিটগুলির সংখ্যাটি পেতে পারেন। বিটমাস্কে থাকা সংখ্যা এটি সাধারণত 10 বিটের চেয়ে কম। এবং 5-10 বিটের জন্য এটি শক্তিশালী এবং ধীরতম হ্যাশ ফাংশনগুলির সাথেও ব্রুট ফোর্সের সংঘর্ষের কাছে তুচ্ছ। আপনি আপনার 32 বিট বা 64 বিট হ্যাশ ফাংশনগুলির পুরো সুরক্ষা পাবেন না। এবং বিষয়টি হ'ল দ্রুত ছোট হ্যাশ ফাংশনগুলি ব্যবহার করা, বচসা বা এমনকি সিফ্যাশের মতো দানব নয়।

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

সুতরাং এই ধরণের সংঘর্ষের আক্রমণ থেকে রোধ করার সর্বোত্তম বিকল্পগুলি হ'ল হয়

1) প্রাইম টেবিলগুলি ব্যবহার করা, কারণ তখন

  • সমস্ত 32 বা 64 বিট বালতিটি সন্ধান করার জন্য প্রাসঙ্গিক, কেবল কয়েকটি নয়।
  • হ্যাশ টেবিল পুনরায় আকার ফাংশন ঠিক দ্বিগুণ চেয়ে প্রাকৃতিক। সেরা গ্রোথ ফাংশন হ'ল ফিবোনাচি সিকোয়েন্স এবং প্রাইমস দ্বিগুণ হওয়ার চেয়ে কাছে আসে।

2) 2 মাপের দ্রুত শক্তির সাথে, প্রকৃত আক্রমণটির বিরুদ্ধে আরও ভাল ব্যবস্থা ব্যবহার করুন।

  • সংঘর্ষগুলি গণনা করুন এবং সনাক্ত করা আক্রমণগুলিতে বিসর্জন বা ঘুমান, যা <1% এর সম্ভাব্যতার সাথে সংঘর্ষের সংখ্যা। 100-এর মতো 32 বিট হ্যাশ টেবিলগুলি। উদাহরণস্বরূপ, ডিজেবি'র ডিএনএস সমাধানকারী এটি করে।
  • সংঘর্ষের আক্রমণ শনাক্ত হওয়ার পরে গাছের সংঘর্ষের লিটিকে ও (লগ এন) অনুসন্ধানের সাথে ও (লগ এন) অনুসন্ধান করুন না O যেমন জাভা কি করে।

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

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

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


-1
function eratosthenes(n) {

    function getPrime(x) {
        var middle = (x-(x%2))/2;
        var arr_rest = [];
        for(var j=2 ; j<=middle;j++){
            arr_rest.push(x%j);
        }

        if(arr_rest.indexOf(0) == -1) {
            return true
        }else {
            return false
        }

    }
    if(n<2)  {
        return []
    }else if(n==2){
        return [2]
    }else {
        var arr = [2]
        for(var i=3;i<n;i++) {
            if(getPrime(i)){
                arr.push(i)
            }
        }
    }

    return arr;
}

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