স্ট্রিংয়ে জাভার হ্যাশকোড () কেন একক গুণক হিসাবে 31 ব্যবহার করে?


480

জাভা ডকুমেন্টেশন অনুযায়ী, কোনও বস্তুর জন্য হ্যাশ কোডটি এইString হিসাবে গণনা করা হয়:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

ব্যবহার intগাণিতিক, যেখানে s[i]হয় আমি , স্ট্রিং এর ম চরিত্র nস্ট্রিং এর দৈর্ঘ্য, এবং ^exponentiation নির্দেশ করে।

কেন 31 টি গুণক হিসাবে ব্যবহৃত হয়?

আমি বুঝতে পারি যে গুণকটি তুলনামূলকভাবে বড় মৌলিক সংখ্যা হওয়া উচিত। তাহলে কেন 29, বা 37, বা 97 নয়?


1
এছাড়াও তুলনা stackoverflow.com/questions/1835976/... - আমার মনে হয় 31 একটি খারাপ পছন্দ যদি আপনার নিজস্ব হ্যাশকোড ফাংশন লিখে থাকি।
হান্স-পিটার স্টার

6
যদি এটি 29 বা 37 বা এমনকি 97 হয় তবে আপনি জিজ্ঞাসা করবেন 'কেন 31 নয়?'
মারকুইস

2
@ ইজেপিকে একটি নম্বর পছন্দ করার পিছনে কারণটি জানা গুরুত্বপূর্ণ। যদি না নম্বরটি একটি কালো যাদু কৌশলের ফলাফল না হয়।
দুশায়ন্ত সবরওয়াল

এটি সম্পর্কে @ পিটার-লরির একটি ব্লগ পোস্ট রয়েছে: ভ্যানিলা- java.github.io/2018/08/12/… এবং এখানে: ভ্যানিলা- java.github.io/2018/08/15/…
ক্রিস্টোফ রাউসি

@DushyantSabharwal আমার পয়েন্ট এটি থাকতে পারে হয়েছে 29 বা 37 বা 97, বা 41, বা অন্যান্য অনেক মূল্যবোধ, অনেক ব্যবহারিক পার্থক্য তৈরি করে। 1976 সালে আমরা 37 ব্যবহার করছিলাম
লার্নের মারকুইস

উত্তর:


405

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

31 টি মানটি বেছে নেওয়া হয়েছে কারণ এটি একটি বিজোড় প্রাইম। যদি এটি সমান হয় এবং গুণটি উপচে পড়ে যায় তবে তথ্য হারিয়ে যাবে, কারণ 2 দ্বারা গুণন স্থানান্তরিত হওয়ার সমতুল্য। প্রাইম ব্যবহারের সুবিধাটি কম পরিষ্কার, তবে এটি প্রচলিত। 31 একটি সুন্দর সম্পত্তি যে গুণ একটি স্থানান্তর এবং ভাল কার্য সম্পাদনার জন্য একটি বিয়োগ দ্বারা প্রতিস্থাপিত করা যেতে পারে: 31 * i == (i << 5) - i। আধুনিক ভিএমগুলি এই ধরণের অপ্টিমাইজেশন স্বয়ংক্রিয়ভাবে করে।

(অধ্যায় 3, আইটেম 9 থেকে: আপনি যখন সমান, ওভাররাইড করবেন তখন সর্বদা হ্যাশকোডকে ওভাররাইড করুন)


346
ঠিক আছে 2 বাদে সমস্ত প্রাইমগুলি বিজোড়।
কিপ

38
আমার মনে হয় না ব্লচ বলছেন যে এটি বেছে নেওয়া হয়েছে কারণ এটি একটি বিজোড় প্রাইম ছিল, তবে কারণ এটি বিজোড় ছিল এবং কারণ এটি প্রধান ছিল (এবং কারণ এটি সহজেই একটি শিফ্ট / বিয়োগে অনুকূলিত হতে পারে)।
18:48

50
31 বেছে নেওয়া হয়েছে কোজ এটি একটি বিজোড় প্রাইম ??? এটির কোনও মানে হয় না - আমি বলি যে 31 টি নির্বাচিত হয়েছিল কারণ এটি সর্বোত্তম বিতরণ দিয়েছে - চেক করুন কম্পিউটিং
কম্পিউটিং

65
আমি মনে করি 31 এর পছন্দটি বরং দুর্ভাগ্যজনক। অবশ্যই, এটি পুরানো মেশিনে কয়েকটি সিপিইউ চক্র সংরক্ষণ করতে পারে তবে "@ এবং #!, অথবা সিএ এবং ডিবি এর মতো সংক্ষিপ্ত ascii স্ট্রিংগুলিতে আপনার ইতিমধ্যে হ্যাশ সংঘর্ষ হয়েছে you উদাহরণস্বরূপ, 1327144003 বা এটিকে বেছে নিলে এটি ঘটে না at কমপক্ষে 524287 যা বিটশিফ্টেরও অনুমতি দেয়: 524287 * i == i << 19 - i।
হ্যান্স-পিটার স্টার

15
@Jason আমার উত্তর দেখুন stackoverflow.com/questions/1835976/... । আমার বক্তব্যটি: আপনি যদি বৃহত্তর প্রাইম ব্যবহার করেন তবে আপনি খুব কম সংঘর্ষ পেতে পারেন এবং আজকাল কিছুই হারান না। সমস্যাটি আরও খারাপ যদি আপনি অ অ-এসকি চরগুলি সহ অ-ইংরাজী ভাষা ব্যবহার করেন। এবং 31 তাদের নিজস্ব হ্যাশকোড ফাংশন লেখার সময় অনেক প্রোগ্রামারদের জন্য খারাপ উদাহরণ হিসাবে কাজ করে।
হ্যান্স-পিটার স্টার

80

গুডরিচ এবং তামাসিয়া যেমন উল্লেখ করেছেন, আপনি যদি ৫০,০০০ এর বেশি ইংরেজি শব্দ (ইউনিক্সের দুটি রূপে প্রদত্ত শব্দের তালিকার মিলন হিসাবে গঠিত) ব্যবহার করেন, তবে 31, 33, 37, 39, এবং 41 এর ধ্রুবক ব্যবহার করে 7 টিরও কম সংঘর্ষ তৈরি হবে অস্ত্রোপচার. এটি জানার পরে অবাক হওয়ার কিছু নেই যে অনেক জাভা বাস্তবায়ন এই ধ্রুবকগুলির মধ্যে একটি বেছে নেয়।

কাকতালীয়ভাবে, আমি যখন এই প্রশ্নটি দেখলাম তখন "বহুপদী হ্যাশ কোডগুলি" বিভাগটি পড়ার মাঝখানে ছিলাম।

সম্পাদনা করুন: আমি উপরে উল্লেখ করছি 10 এমবি পিডিএফ বইয়ের লিঙ্কটি। জাভাতে ডেটা স্ট্রাকচার এবং অ্যালগরিদমের বিভাগ 10.2 হ্যাশ টেবিলগুলি (পৃষ্ঠা 413) দেখুন


6
তবে খেয়াল করুন যে আপনি যদি ASCII সীমার বাইরে সাধারণ অক্ষরগুলির সাথে কোনও ধরণের আন্তর্জাতিক চরসেট ব্যবহার করেন তবে আপনি WAY আরও সংঘর্ষ পেতে পারেন। কমপক্ষে, আমি 31 এবং জার্মানের জন্য এটি পরীক্ষা করেছিলাম। সুতরাং আমি মনে করি 31 এর পছন্দটি নষ্ট হয়ে গেছে।
হ্যান্স-পিটার স্টার

1
@jJack, আপনার উত্তরে প্রদত্ত লিঙ্কটি ভেঙে গেছে।
এস কে ভেঙ্কট

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

58

(বেশিরভাগ) পুরানো প্রসেসরগুলিতে, 31 দ্বারা গুণ করা তুলনামূলকভাবে সস্তা হতে পারে। উদাহরণস্বরূপ, একটি এআরএম এ এটি কেবল একটি নির্দেশ:

RSB       r1, r0, r0, ASL #5    ; r1 := - r0 + (r0<<5)

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

এটি কোনও দুর্দান্ত হ্যাশ অ্যালগরিদম নয়, তবে এটি 1.0 কোডের চেয়ে যথেষ্ট ভাল এবং ভাল (এবং 1.0 টির চেয়ে অনেক ভাল!)।


7
যথেষ্ট মজাদার, 31 এর সাথে গুণটি আমার ডেস্কটপ মেশিনে আসলে 9222 এর সাথে গুণনের তুলনায় কিছুটা ধীর গতিতে রয়েছে I আমি অনুমান করি যে সংকলকটি এটিকে শিফটে "অনুকূলিতকরণ" করার চেষ্টা করে এবং পাশাপাশি যুক্ত করে। :-)
হ্যান্স-পিটার স্টার

1
আমার মনে হয় না আমি কখনও এমন একটি এআরএম ব্যবহার করেছি যা +/- 255 পরিসরের সমস্ত মানের সাথে সমান দ্রুত ছিল না। 2 বিয়োগের একের শক্তির ব্যবহারের দুর্ভাগ্যজনক প্রভাব রয়েছে যে দুটি মানের সাথে একটি মিলের পরিবর্তন দুটি পাওয়ার দ্বারা হ্যাশ কোডকে পরিবর্তন করে। -31 এর মানটি আরও ভাল হত, এবং আমি মনে করি -83 (64 + 16 + 2 + 1) এর মতো আরও কিছু ভাল হতে পারে (বিটগুলি কিছুটা আরও ভাল করতে হবে)।
সুপারক্যাট

@ সুপের্যাট বিয়োগ দ্বারা নিশ্চিত নয়। দেখে মনে হচ্ছে আপনি শূন্যের দিকে ফিরে যাবেন। / String.hashCodeস্ট্রংআরএম এর পূর্বাভাস দেয় যা আইআইআরসি একটি 8-বিট গুণক প্রবর্তন করেছিল এবং সম্ভবত শিফট ক্রিয়াকলাপের সাথে সংযুক্ত গাণিতিক / যৌক্তিকের জন্য দুটি চক্রের মধ্যে সম্ভবত বৃদ্ধি পেয়েছে।
টম হাটিন -

1
@ টমহাউটিন-ট্যাকলাইন: ৩১ ব্যবহার করে চারটি মানের হ্যাশ হবে 29791 * এ + 961 * বি + 31 * সি + ডি; -31 ব্যবহার করে এটি -29791 * এ + 961 * বি - 31 * সি + ডি হবে। আমি মনে করি না যে এই চারটি আইটেমটি স্বতন্ত্র হলে পার্থক্যটি তাত্পর্যপূর্ণ হবে, তবে সংলগ্ন আইটেমগুলির জোড়া যদি মিলিত হয়, ফলস্বরূপ হ্যাশ কোডটি সমস্ত অনাকাঙ্ক্ষিত আইটেমের অবদান, প্লাসের মধ্যে 32 (জোড়যুক্তদের) থেকে একাধিক একক হবে। স্ট্রিংগুলির ক্ষেত্রে এটি খুব বেশি গুরুত্বপূর্ণ নাও হতে পারে, তবে যদি কেউ হ্যাশিং সমষ্টিগুলির জন্য একটি সাধারণ-উদ্দেশ্য পদ্ধতি লিখতে থাকে তবে সংলগ্ন আইটেমগুলির মিলের পরিস্থিতি অস্বাভাবিকভাবে সাধারণ হবে।
সুপারক্যাট

3
মজার বিষয় @supercat, এর হ্যাশ কোড Map.Entryস্পেসিফিকেশন দ্বারা সংশোধন করা হয়েছে হতে key.hashCode() ^ value.hashCode()এটা সত্ত্বেও এমনকি একটি unordered জোড়া হিসাবে keyএবং valueসম্পূর্ণরূপে ভিন্ন অর্থ আছে। হ্যাঁ, এর দ্বারা বোঝা যায় যে Map.of(42, 42).hashCode()বা অন্যান্য Map.of("foo", "foo", "bar", "bar").hashCode(), পূর্বে অনুমানযোগ্য শূন্য। সুতরাং অন্য মানচিত্রের কী হিসাবে মানচিত্রগুলি ব্যবহার করবেন না ...
হোলার

33

গুণ করে, বিটগুলি বামে স্থানান্তরিত হয়। এটি হ্যাশ কোডগুলির উপলভ্য স্থানের বেশি ব্যবহার করে সংঘর্ষগুলি হ্রাস করে।

দুটি পাওয়ার ব্যবহার না করে, নিম্ন-অর্ডার, ডানদিকের বিটগুলি পাশাপাশি পপ করা হয়, হ্যাশটিতে যাওয়ার পরবর্তী অংশের ডেটা মিশ্রিত করতে।

ভাবটি n * 31সমান (n << 5) - n


29

আপনি http://bugs.java.com/bugdatedia/view_bug.do?bug_id=4045622 এ "মন্তব্য" এর অধীনে ব্লচের মূল যুক্তিটি পড়তে পারেন । তিনি একটি হ্যাশ টেবিলের ফলাফল "গড় চেইনের আকার" এর সাথে সম্পর্কিত বিভিন্ন হ্যাশ ফাংশনগুলির কার্যকারিতা তদন্ত করেছিলেন। P(31)তিনি কে ও আর এর বইতে পাওয়া সেই সময়ের মধ্যে একটি সাধারণ কাজ ছিল (তবে কার্নিগান এবং রিচিও কোথা থেকে এসেছে তা মনে করতে পারেনি)। শেষ পর্যন্ত তাকে মূলত একটি বেছে নিতে হয়েছিল এবং তাই তিনি গ্রহণ করেছিলেন P(31)যেহেতু এটি যথেষ্ট ভাল পারফরম্যান্সের বলে মনে হয়েছিল। যদিও P(33)এটি খুব খারাপ ছিল না এবং 33 দ্বারা গুণন করাও সমানভাবে দ্রুত গণনা করা সম্ভব (কেবলমাত্র 5 দ্বারা একটি শিফট এবং একটি সংযোজন), তিনি 31 বেছে নিয়েছেন, যেহেতু 33টি প্রধান নয়:

বাকি চারটির মধ্যে আমি সম্ভবত পি (৩১) নির্বাচন করব, কারণ এটি একটি আরআইএসসি মেশিনে গণনা করা সবচেয়ে সস্তা (কারণ ৩১ টি দুটি শক্তির পার্থক্য)। পি (33) গণনা করার জন্য একইভাবে সস্তা, তবে এটির পারফরম্যান্স সামান্য খারাপ এবং 33 টি সংমিশ্রণ, যা আমাকে কিছুটা ঘাবড়ে যায়।

সুতরাং যুক্তি তত যুক্তিযুক্ত ছিল না যতগুলি এখানে উত্তর উত্তর বোঝাচ্ছে। তবে আমরা অন্ত্রের সিদ্ধান্তের পরে যুক্তিসঙ্গত কারণ নিয়ে আসার পক্ষে ভাল (এবং এমনকি ব্লাচও এর প্রবণ হতে পারে)।


2
পুরো গবেষণা এবং নিরপেক্ষ উত্তর!
বিশাল কে

22

আসলে, 37 বেশ ভাল কাজ করবে! z: = 37 * x হিসাবে গণনা করা যেতে পারে y := x + 8 * x; z := x + 4 * y। উভয় পদক্ষেপ একটি এলইএ x86 নির্দেশাবলীর সাথে মিলে যায় তাই এটি অত্যন্ত দ্রুত।

আসলে, এমনকি-বড় মৌলিক সঙ্গে গুণ 73 সেটিংস এর দ্বারা একই গতিতে কাজ করা যেতে পারে y := x + 8 * x; z := x + 8 * y

Or৩ বা ৩ 37 (৩১ এর পরিবর্তে) ব্যবহার করা আরও ভাল হতে পারে, কারণ এটি ডেনার কোডের দিকে নিয়ে যায় : দুটি এলইএ নির্দেশাবলী কেবল move বাইটের তুলনায় 31 বাইটের সাথে চালান + শিফট + বিয়োগের জন্য 31 দ্বারা গুণফলের জন্য বিয়োগ করে One একটি সম্ভাব্য সতর্কতা হ'ল এখানে ব্যবহৃত 3-যুক্তি এলইএ নির্দেশাবলী 3 টি চক্রের বর্ধিত বিলম্বের সাথে ইন্টেলের স্যান্ডি ব্রিজ আর্কিটেকচারে ধীর হয়ে উঠেছে।

তাছাড়া, 73 হ'ল শেল্ডন কুপারের প্রিয় নম্বর number


5
আপনি কি একটি পাস্কেল প্রোগ্রামার বা কিছু? এর সাথে কী: = স্টাফ?
মাইংই

11
@ মাইঙ্গুয় এটি আসলে ALGOL বাক্য গঠন এবং সিউডো কোডে প্রায়শই ব্যবহৃত হয়।
ডার্কনেস

4
তবে এআরএম
অ্যাসেমব্লিতে


ইন TPOP (1999) এক প্রাথমিক জাভা (p.57) সম্পর্কে পড়তে পারেন: "... সমস্যা এক (একটি গুণক সঙ্গে দেখানো হয়েছে এক সমতুল্য সঙ্গে হ্যাশ প্রতিস্থাপন মুকুব করা হয়েছে 37 ) ..."
মিকু

19

নীল কফফি ব্যাখ্যা করেছেন যে 31 টি পক্ষপাতদুষ্ট করার জন্য কেন ব্যবহার করা হয় ।

মূলত 31 ব্যবহার করা আপনাকে হ্যাশ ফাংশনের জন্য আরও বেশি সেট-বিট সম্ভাব্যতা বিতরণ দেয়।


12

থেকে JDK-4045622 , যেখানে জশুয়া ব্লচ কারণে সেই নির্দিষ্ট (নতুন) বর্ণনা করে String.hashCode()বাস্তবায়ন নির্বাচিত হয়েছে

নীচের সারণীতে তিনটি ডেটা সেটের জন্য উপরে বর্ণিত বিভিন্ন হ্যাশ ফাংশনগুলির সংক্ষিপ্তসার জানানো হয়েছে:

1) মেরিয়ামিয়াম-ওয়েস্টার এর ২ য় ইনট্রি আনব্রিজেড অভিধানে (311,141 স্ট্রিং, গড় দৈর্ঘ্য 10 অক্ষর) এন্ট্রি সহ সমস্ত শব্দ এবং বাক্যাংশ।

2) / বিন / , / ইউএসআর / বিন /, / ইউএসআর / লিব / , / ইউএসআর / ইউসিবি / এবং / ইউএসআর / ওপেনউইন / বিন / * (66,304 স্ট্রিং, গড় দৈর্ঘ্য 21 অক্ষর) এর সমস্ত স্ট্রিং।

3) একটি ওয়েব-ক্রলার দ্বারা সংগৃহীত ইউআরএলগুলির একটি তালিকা যা গত রাতে বেশ কয়েক ঘন্টা চলছিল (28,372 স্ট্রিং, গড় দৈর্ঘ্য 49 টি অক্ষর)।

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

                          Webster's   Code Strings    URLs
                          ---------   ------------    ----
Current Java Fn.          1.2509      1.2738          13.2560
P(37)    [Java]           1.2508      1.2481          1.2454
P(65599) [Aho et al]      1.2490      1.2510          1.2450
P(31)    [K+R]            1.2500      1.2488          1.2425
P(33)    [Torek]          1.2500      1.2500          1.2453
Vo's Fn                   1.2487      1.2471          1.2462
WAIS Fn                   1.2497      1.2519          1.2452
Weinberger's Fn(MatPak)   6.5169      7.2142          30.6864
Weinberger's Fn(24)       1.3222      1.2791          1.9732
Weinberger's Fn(28)       1.2530      1.2506          1.2439

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

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

তামাশা


5

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

হ্যাশ ব্যবহার করে যে সংখ্যাগুলি তৈরি হয় সেগুলি হ'ল:

  • আপনি যে ডেটা টাইপ করেছেন এটির মডুলাস (2 ^ 32 বা 2 ^ 64)
  • আপনার হ্যাশটেবলে বালতি গণনার মডুলাস (পরিবর্তিত হয় j জাভাতে প্রাইম থাকত, এখন 2 ^ n)
  • আপনার মিশ্রণ ক্রিয়ায় কোনও যাদু নম্বর দ্বারা গুণ বা শিফট করুন
  • ইনপুট মান

আপনি কেবলমাত্র এই মানগুলির মধ্যে কয়েকটি নিয়ন্ত্রণ করতে পারেন, তাই একটু বাড়তি যত্নের কারণে।


4

জেডিকের সর্বশেষ সংস্করণে, 31 টি এখনও ব্যবহৃত হয়। https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/String.html#hashCode ()

হ্যাশ স্ট্রিংয়ের উদ্দেশ্য

  • অনন্য ( ^হ্যাশকোড গণনা নথিতে অপারেটরটি দেখতে দিন , এটি অনন্যকে সহায়তা করে)
  • গণনার জন্য সস্তা ব্যয়

৩১ হ'ল সর্বোচ্চ মানটি 8 বিট (= 1 বাইট) রেজিস্টারে রাখতে পারেন, বৃহত্তম বাম সংখ্যাটি 1 বাইট রেজিস্টারে রাখতে পারেন, বিজোড় সংখ্যা।

31 এর গুণক << 5 তারপর নিজেই বিয়োগ করুন, সুতরাং সস্তা সংস্থান দরকার।


3

আমি নিশ্চিত নই, তবে আমি অনুমান করব যে তারা মৌলিক সংখ্যার কয়েকটি নমুনা পরীক্ষা করেছে এবং 31 টি সম্ভাব্য স্ট্রিংয়ের কিছু নমুনায় সেরা বিতরণ করেছে বলে মনে করেছে।


1

এটি হ'ল 31 এর একটি দুর্দান্ত সম্পত্তি রয়েছে - এর গুণকটি বিটওয়াসা শিফ্ট দ্বারা প্রতিস্থাপন করা যেতে পারে যা স্ট্যান্ডার্ড গুণণের চেয়ে দ্রুত is

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