আমি কিছু আলাদা অ্যালগরিদম পরীক্ষা করেছি, গতি এবং সংঘর্ষের সংখ্যা পরিমাপ করছি।
আমি তিনটি ভিন্ন কী সেট ব্যবহার করেছি:
প্রতিটি কর্পাসের জন্য, সংঘর্ষের সংখ্যা এবং হ্যাশিংয়ের জন্য ব্যয় করা গড় সময় রেকর্ড করা হয়েছিল।
আমি পরীক্ষা করেছি:
ফলাফল
প্রতিটি ফলাফলের গড় হ্যাশ সময় এবং সংঘর্ষের সংখ্যা থাকে
Hash Lowercase Random UUID Numbers
============= ============= =========== ==============
Murmur 145 ns 259 ns 92 ns
6 collis 5 collis 0 collis
FNV-1a 152 ns 504 ns 86 ns
4 collis 4 collis 0 collis
FNV-1 184 ns 730 ns 92 ns
1 collis 5 collis 0 collis▪
DBJ2a 158 ns 443 ns 91 ns
5 collis 6 collis 0 collis▪▪▪
DJB2 156 ns 437 ns 93 ns
7 collis 6 collis 0 collis▪▪▪
SDBM 148 ns 484 ns 90 ns
4 collis 6 collis 0 collis**
SuperFastHash 164 ns 344 ns 118 ns
85 collis 4 collis 18742 collis
CRC32 250 ns 946 ns 130 ns
2 collis 0 collis 0 collis
LoseLose 338 ns - -
215178 collis
দ্রষ্টব্য :
সংঘর্ষ কি আসলেই ঘটে?
হ্যাঁ. হ্যাশের সংঘর্ষগুলি আসলে ঘটে কিনা তা দেখার জন্য আমি আমার পরীক্ষার প্রোগ্রামটি লিখতে শুরু করেছিলাম - এবং এটি কেবল একটি তাত্ত্বিক গঠন নয়। তারা আসলে ঘটে:
এফএনভি -১ এর সংঘর্ষ
creamwove
সঙ্গে সংঘর্ষ quists
এফএনভি -১ এ সংঘর্ষ হয়
costarring
সঙ্গে সংঘর্ষ liquid
declinate
সঙ্গে সংঘর্ষ macallums
altarage
সঙ্গে সংঘর্ষ zinke
altarages
সঙ্গে সংঘর্ষ zinkes
মারমুর 2 সংঘর্ষ
cataract
সঙ্গে সংঘর্ষ periti
roquette
সঙ্গে সংঘর্ষ skivie
shawl
সঙ্গে সংঘর্ষ stormbound
dowlases
সঙ্গে সংঘর্ষ tramontane
cricketings
সঙ্গে সংঘর্ষ twanger
longans
সঙ্গে সংঘর্ষ whigs
ডিজেবি 2 এর সংঘর্ষ
hetairas
সঙ্গে সংঘর্ষ mentioner
heliotropes
সঙ্গে সংঘর্ষ neurospora
depravement
সঙ্গে সংঘর্ষ serafins
stylist
সঙ্গে সংঘর্ষ subgenera
joyful
সঙ্গে সংঘর্ষ synaphea
redescribed
সঙ্গে সংঘর্ষ urites
dram
সঙ্গে সংঘর্ষ vivency
ডিজেবি 2 এ সংঘর্ষ হয়
haggadot
সঙ্গে সংঘর্ষ loathsomenesses
adorablenesses
সঙ্গে সংঘর্ষ rentability
playwright
সঙ্গে সংঘর্ষ snush
playwrighting
সঙ্গে সংঘর্ষ snushing
treponematoses
সঙ্গে সংঘর্ষ waterbeds
সিআরসি 32 সংঘর্ষ
codding
সঙ্গে সংঘর্ষ gnu
exhibiters
সঙ্গে সংঘর্ষ schlager
সুপারফাস্টহ্যাশ সংঘর্ষ
dahabiah
সঙ্গে সংঘর্ষ drapability
encharm
সঙ্গে সংঘর্ষ enclave
grahams
সঙ্গে সংঘর্ষ gramary
- ... স্নিপ করুন 79 টি সংঘর্ষ ...
night
সঙ্গে সংঘর্ষ vigil
nights
সঙ্গে সংঘর্ষ vigils
finks
সঙ্গে সংঘর্ষ vinic
Randomnessification
অন্যান্য বিষয়গত পরিমাপ হ্যাশগুলি এলোমেলোভাবে বিতরণ করা হয়। ফলাফলের হ্যাশ টেবিলগুলি ম্যাপিং থেকে দেখানো হয় যে সমানভাবে ডেটা বিতরণ করা হয়। সমস্ত হ্যাশ ফাংশনগুলি টেবিলে রৈখিকভাবে ম্যাপিং করার সময় ভাল বিতরণ দেখায়:
বা হিলবার্ট মানচিত্র হিসাবে ( এক্সকেসিডি সর্বদা প্রাসঙ্গিক ):
সংখ্যার স্ট্রিং ( "1"
,, "2"
..., "216553"
) হ্যাশ করার পরে (উদাহরণস্বরূপ, জিপ কোডগুলি ) বাদে যেখানে বেশিরভাগ হ্যাশিং অ্যালগরিদমে প্যাটার্নগুলি উদ্ভূত হয়:
এসডিবিএম :
ডিজেবি 2 এ :
এফএনভি -১ :
এফএনভি -১ এ ব্যতীত সমস্ত , যা এখনও আমার কাছে এলোমেলো দেখায়:
আসলে, মর্মুর 2 এরNumbers
চেয়ে আরও ভাল এলোমেলোতা রয়েছে বলে মনে হচ্ছে FNV-1a
:
আমি যখন FNV-1a
"নম্বর" মানচিত্রটি দেখি , তখন আমার মনে হয় আমি সূক্ষ্ম উল্লম্ব নিদর্শনগুলি দেখতে পাচ্ছি। মারমুরের সাথে আমি কোনও প্যাটার্ন দেখি না। আপনি কি মনে করেন?
*
টেবিলের অতিরিক্তটি এলোমেলোভাবে কতটা খারাপ তা বোঝায়। সঙ্গে FNV-1a
সেরা হচ্ছে, এবং DJB2x
খারাপ হচ্ছে:
Murmur2: .
FNV-1a: .
FNV-1: ▪
DJB2: ▪▪
DJB2a: ▪▪
SDBM: ▪▪▪
SuperFastHash: .
CRC: ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
Loselose: ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
▪
▪▪▪▪▪▪▪▪▪▪▪▪▪
▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
আমি মূলত এই প্রোগ্রামটি লিখেছিলাম যাতে সংঘর্ষের বিষয়ে আমারও চিন্তা করতে হয় কিনা : আমি তা করি।
এবং তারপরে এটি নিশ্চিত হয়ে যায় যে হ্যাশ ফাংশনগুলি পর্যাপ্ত পরিমাণে এলোমেলো ছিল।
FNV-1a অ্যালগরিদম
এফএনভি 1 হ্যাশটি 32, 64, 128, 256, 512 এবং 1024 বিট হ্যাশগুলিতে ফিরে আসে।
FNV-1A অ্যালগরিদম হল:
hash = FNV_offset_basis
for each octetOfData to be hashed
hash = hash xor octetOfData
hash = hash * FNV_prime
return hash
যেখানে ধ্রুবকগুলি FNV_offset_basis
এবং FNV_prime
আপনি যে রিটার্ন হ্যাশ আকারটি চান তার উপর নির্ভর করে:
Hash Size
===========
32-bit
prime: 2^24 + 2^8 + 0x93 = 16777619
offset: 2166136261
64-bit
prime: 2^40 + 2^8 + 0xb3 = 1099511628211
offset: 14695981039346656037
128-bit
prime: 2^88 + 2^8 + 0x3b = 309485009821345068724781371
offset: 144066263297769815596495629667062367629
256-bit
prime: 2^168 + 2^8 + 0x63 = 374144419156711147060143317175368453031918731002211
offset: 100029257958052580907070968620625704837092796014241193945225284501741471925557
512-bit
prime: 2^344 + 2^8 + 0x57 = 35835915874844867368919076489095108449946327955754392558399825615420669938882575126094039892345713852759
offset: 9659303129496669498009435400716310466090418745672637896108374329434462657994582932197716438449813051892206539805784495328239340083876191928701583869517785
1024-bit
prime: 2^680 + 2^8 + 0x8d = 5016456510113118655434598811035278955030765345404790744303017523831112055108147451509157692220295382716162651878526895249385292291816524375083746691371804094271873160484737966720260389217684476157468082573
offset: 1419779506494762106872207064140321832088062279544193396087847491461758272325229673230371772250864096521202355549365628174669108571814760471015076148029755969804077320157692458563003215304957150157403644460363550505412711285966361610267868082893823963790439336411086884584107735010676915
দেখুন প্রধান FNV পৃষ্ঠা বিস্তারিত জানার জন্য।
আমার সমস্ত ফলাফল 32-বিট বৈকল্পিকের সাথে রয়েছে।
এফএনভি -১ এফএনভি -১ এ এর চেয়ে ভাল?
নং এফএনভি -১ এ চারপাশে আরও ভাল। ইংরেজি শব্দ কর্পাস ব্যবহার করার সময় এফএনভি -১ এ এর সাথে আরও সংঘর্ষ হয়েছিল:
Hash Word Collisions
====== ===============
FNV-1 1
FNV-1a 4
এখন ছোট হাতের এবং বড় হাতের তুলনা করুন:
Hash lowercase word Collisions UPPERCASE word collisions
====== ========================= =========================
FNV-1 1 9
FNV-1a 4 11
এই ক্ষেত্রে FNV-1a "400%" FN-1 এর চেয়ে খারাপ নয়, কেবল 20% খারাপ।
আমি মনে করি যে আরও গুরুত্বপূর্ণ গ্রহণযোগ্যতা হ'ল এটি যখন সংঘর্ষের কথা আসে তখন দুটি শ্রেণীর অ্যালগরিদম থাকে:
- সংঘর্ষগুলি বিরল : FNV-1, FNV-1a, DJB2, DJB2a, SDBM
- সংঘর্ষগুলি সাধারণ : সুপারফাস্টহ্যাশ, লসলোজ
এবং তারপরে হ্যাশগুলি সমানভাবে বিতরণ করার পদ্ধতি রয়েছে:
- অসামান্য বিতরণ: মর্মুর 2, এফএনভি -1 এ, সুপারফাস্টহাস
- চমৎকার বিতরণ: এফএনভি -১
- ভাল বিতরণ: এসডিবিএম, ডিজেবি 2, ডিজেবি 2 এ
- ভয়াবহ বিতরণ: লসলোজ
হালনাগাদ
অভিয়োগ করবে? অবশ্যই, কেন না
হালনাগাদ
@Whathisname কীভাবে একটি সিআরসি 32 সম্পাদন করবে তা অবাক করে দিয়ে টেবিলে সংখ্যার যোগ করলেন।
সিআরসি 32 বেশ ভাল । কয়েকটি সংঘর্ষ, তবে ধীর এবং 1 কে লুবাইক টেবিলের ওভারহেড।
সিআরসি বিতরণ সম্পর্কে সমস্ত ভুল জিনিস স্নিপ করুন - আমার খারাপ
আজ অবধি আমি এফএনভি -১ এটিকে আমার ডি ফ্যাক্টো হ্যাশ-টেবিল হ্যাশিং অ্যালগরিদম হিসাবে ব্যবহার করতে যাচ্ছিলাম । তবে এখন আমি মর্মুর 2 এ চলেছি:
- দ্রুত
- সমস্ত শ্রেণির ইনপুটটির আরও ভাল এলোমেলোকরণ
এবং আমি সত্যিই, সত্যিই কিছু ভুল আশা SuperFastHash
অ্যালগরিদম আমি দেখেছি ; এটি যতটা জনপ্রিয় তার পক্ষে খুব খারাপ।
আপডেট: গুগলে মার্মুরহ্যাশ 3 হোমপেজ থেকে :
(1) - সুপারফাস্টহ্যাশের খুব খারাপ সংঘর্ষের বৈশিষ্ট্য রয়েছে, যা অন্য কোথাও নথিভুক্ত করা হয়েছে।
সুতরাং আমি অনুমান করি যে এটি কেবল আমারই নয়।
আপডেট: আমি বুঝতে পেরেছি কেন Murmur
অন্যদের চেয়ে দ্রুত। মারমুরহ্যাশ 2 একবারে চারটি বাইটে পরিচালনা করে। বেশিরভাগ অ্যালগরিদম বাইট বাই :
for each octet in Key
AddTheOctetToTheHash
এর অর্থ কীগুলি দীর্ঘায়িত হওয়ার সাথে সাথে মুরমুর জ্বলজ্বল করার সুযোগ পায়।
হালনাগাদ
রেমন্ড চেনের একটি সময়োচিত পোস্ট এই সত্যটি পুনরুদ্ধার করে যে "এলোমেলো" জিইউইডিগুলি তাদের এলোমেলোতার জন্য ব্যবহার করা হয় না। তারা বা সেগুলির একটি উপসেট হ্যাশ কী হিসাবে অনুপযুক্ত:
এমনকি সংস্করণ 4 জিইউইডি অ্যালগরিদমটি অনির্দেশীয় হওয়ার নিশ্চয়তা নেই, কারণ অ্যালগরিদম এলোমেলো সংখ্যা জেনারেটরের গুণমান নির্দিষ্ট করে না। জিইউডির উইকিপিডিয়া নিবন্ধে প্রাথমিক গবেষণা রয়েছে যা জেনারেটর ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী না হওয়ার কারণে এলোমেলো সংখ্যা জেনারেটর রাষ্ট্রের জ্ঞানের উপর ভিত্তি করে ভবিষ্যতের এবং পূর্ববর্তী জিইউইডিগুলির পূর্বাভাস দেওয়া যেতে পারে বলে প্রস্তাবিত ।
র্যান্ডোমাস সংঘর্ষ এড়ানোর মতো নয়; যে কারণে "এলোমেলো" গাইডের কিছু উপসেট নিয়ে নিজের "হ্যাশিং" অ্যালগরিদম আবিষ্কার করার চেষ্টা করা ভুল হবে:
int HashKeyFromGuid(Guid type4uuid)
{
//A "4" is put somewhere in the GUID.
//I can't remember exactly where, but it doesn't matter for
//the illustrative purposes of this pseudocode
int guidVersion = ((type4uuid.D3 & 0x0f00) >> 8);
Assert(guidVersion == 4);
return (int)GetFirstFourBytesOfGuid(type4uuid);
}
দ্রষ্টব্য : আবারও আমি উদ্ধৃতিগুলিতে "এলোমেলো জিইউইডি" রেখেছি কারণ এটি জিইউইডিগুলির "র্যান্ডম" বৈকল্পিক। আরও সঠিক বর্ণনা হবে Type 4 UUID
। তবে কী টাইপ 4, বা 1, 3 এবং 5 প্রকারের তা কেউ জানে না। সুতরাং তাদের "এলোমেলো" জিইউইডি বলা সহজতর।
সমস্ত ইংরেজি শব্দ আয়না