স্বতন্ত্রতা এবং গতির জন্য কোন হ্যাশিং অ্যালগরিদম সেরা?


1388

স্বতন্ত্রতা এবং গতির জন্য কোন হ্যাশিং অ্যালগরিদম সেরা? উদাহরণ (ভাল) ব্যবহারের মধ্যে হ্যাশ অভিধান অন্তর্ভুক্ত রয়েছে।

আমি জানি SHA-256 এবং এর মতো জিনিস রয়েছে তবে এই অ্যালগোরিদমগুলি সুরক্ষিত করার জন্য ডিজাইন করা হয়েছে , যার অর্থ সাধারণত এগুলি অ্যালগরিদমের চেয়ে ধীর হয় যা কম অনন্য । আমি দ্রুত হবার জন্য ডিজাইন করা একটি হ্যাশ অ্যালগরিদম চাই, তবে সংঘর্ষ এড়াতে মোটামুটি অনন্য থাকতে হবে।


9
সুরক্ষা বা অন্য কোন উদ্দেশ্যে?
0-05 এ Orbling

19
একটি হ্যাশ অভিধান বাস্তবায়নের জন্য @ অরব্লিং। সুতরাং সংঘর্ষগুলি একটি সর্বনিম্ন রাখা উচিত, তবে এটির কোনও সুরক্ষার উদ্দেশ্য নেই।
আর্লজ

4
নোট করুন যে আপনার হ্যাশ টেবিলের মধ্যে কমপক্ষে কিছু সংঘর্ষের আশা করতে হবে , অন্যথায় টেবিলটি অপেক্ষাকৃত কম সংখ্যক কীগুলিও পরিচালনা করতে সক্ষম হতে হবে ...
ডিন হার্ডিং

19
দুর্দান্ত পোস্ট! আপনি কি ইয়ান কোলেটের এক্সএক্সএইচএক্স (স্রষ্টা বা এলজেড 4) পরীক্ষা করতে পারবেন, যা মার্মুরের চেয়ে দ্বিগুণ দ্রুত? হোমপেজ: code.google.com/p/xxhash : আরো তথ্য fastcompression.blogspot.fr/2012/04/...

24
@zvrba অ্যালগরিদমের উপর নির্ভর করে। bcrypt ধীর হতে ডিজাইন করা হয়েছে।
ইজকাটা

উত্তর:


2461

আমি কিছু আলাদা অ্যালগরিদম পরীক্ষা করেছি, গতি এবং সংঘর্ষের সংখ্যা পরিমাপ করছি।

আমি তিনটি ভিন্ন কী সেট ব্যবহার করেছি:

প্রতিটি কর্পাসের জন্য, সংঘর্ষের সংখ্যা এবং হ্যাশিংয়ের জন্য ব্যয় করা গড় সময় রেকর্ড করা হয়েছিল।

আমি পরীক্ষা করেছি:

ফলাফল

প্রতিটি ফলাফলের গড় হ্যাশ সময় এবং সংঘর্ষের সংখ্যা থাকে

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 প্রকারের তা কেউ জানে না। সুতরাং তাদের "এলোমেলো" জিইউইডি বলা সহজতর।

সমস্ত ইংরেজি শব্দ আয়না


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

8
ইয়ান কোলেটের 'এক্সএক্সএইচএস' নামে একটি নতুন হ্যাশ সম্প্রতি ঘোরাফেরা করছে। আমি সবসময় নতুন হ্যাশ সম্পর্কে সন্দেহ করি। এটি আপনার তুলনায় এটি আকর্ষণীয় হবে, (যদি আপনি লোকেরা এলোমেলো হ্যাশ যুক্ত করার কথা শুনে পরামর্শ দিয়ে ক্লান্ত না হন ...)
th_in_gs

7
প্রকৃতপক্ষে. এক্সএক্সএইচএস প্রকল্পের পৃষ্ঠা দ্বারা ঘোষিত পারফরম্যান্স নম্বরগুলি চিত্তাকর্ষক দেখাচ্ছে, সম্ভবত এটি খুব বেশি সত্য। ভাল, কমপক্ষে, এটি একটি মুক্ত উত্স প্রকল্প: কোড. google.com/p/xxhash
ট্র্যাকার

9
হাই ইয়ান, আমার সুপারফাস্টহ্যাশটির ডেল্ফি বাস্তবায়ন সঠিক is বাস্তবায়ন করার সময় আমি আমার বাস্তবায়নের ফলাফল এবং রেফারেন্স প্রয়োগের ফলাফলের তুলনা করতে সি এবং ডেলফিতে একটি পরীক্ষা সেট তৈরি করেছিলাম। কোনও পার্থক্য নেই। সুতরাং আপনি যা দেখছেন তা হ্যাশের আসল খারাপতা ... (এই কারণেই আমি একটি মর্মুরহশ বাস্তবায়ন প্রকাশ করেছি:
ল্যান্ডম্যান-

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

59

যদি আপনি কোনও অপরিবর্তনীয় অভিধান থেকে হ্যাশ মানচিত্র তৈরি করতে চান, আপনি হ্যাশ ফাংশন এবং হ্যাশ টেবিলটি নির্মাণের সময় নিখুঁত হ্যাশিং https://en.wikedia.org/wiki/Liveect_hash_function বিবেচনা করতে চাইতে পারেন , আপনি গ্যারান্টি দিতে পারেন, প্রদত্ত ডেটাসেটের জন্য, যে কোনও সংঘর্ষ হবে না।


2
পারফরম্যান্স হ্যাশিং burtleburtle.net/bob/hash/perfect.html সম্পর্কে পারফরম্যান্স ডেটা সহ এখানে আরও কিছু বলা হয়েছে , যদিও এটি সর্বাধিক বর্তমান প্রসেসর ইত্যাদি ব্যবহার করে না
এলি কেসেলম্যান

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

1
@ devios1 আপনার বক্তব্য অর্থহীন। প্রথমত, একটি হ্যাশ টেবিলের মানগুলি নিখুঁত বা না, কীগুলি থেকে স্বতন্ত্র। দ্বিতীয়ত, একটি নিখুঁত হ্যাশ টেবিল হ'ল মানগুলির একটি লিনিয়ার অ্যারে, তৈরি করা ফাংশনটির ফলাফল দ্বারা সূচিযুক্ত যাতে সমস্ত সূচকগুলি অনন্য।
জিম বাল্টার

1
@ মার্কাসজে পারফেক্ট হ্যাশিং সাধারণত ১০০ টিরও কম কী ব্যবহার করা হয় তবে cmph.sourceforge.net দেখুন ... এখনও আপনার পরিসীমা থেকে খুব কম।
জিম বাল্টার

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

34

এখানে হ্যাশ ফাংশনগুলির একটি তালিকা রয়েছে তবে সংক্ষিপ্ত সংস্করণটি হ'ল:

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

unsigned long
hash(unsigned char *str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}

6
আসলে ডিজেবি 2 শূন্য সংবেদনশীল, যেমন সর্বাধিক সাধারণ হ্যাশ ফাংশন, তাই আপনি সহজেই এই জাতীয় হ্যাশগুলি ভাঙ্গতে পারেন। এটির অনেকগুলি সংঘর্ষ এবং একটি খারাপ বিতরণ একটি খারাপ পক্ষপাত রয়েছে, এটি বেশিরভাগ স্মাশারের গুণমান পরীক্ষাগুলিতে ভেঙে যায়: github.com/rurban/smhasher/blob/master/doc/bernstein তাঁর সিডিবি ডাটাবেস এটি ব্যবহার করে, তবে আমি এটি ব্যবহার করব না জনসাধারণের প্রবেশাধিকারের সাথে।
রাবারবান

2
পারফরম্যান্স এবং বিতরণের অবস্থান থেকে ডিজেবি বেশ খারাপ। আমি আজ এটি ব্যবহার না।
কনরাড মেয়ার 21

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

28

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

আরও বিশদের জন্য ব্লগটি পড়ুন এবং কোডটি এখানে উপলভ্য

সিটিহ্যাশ সি ++ তে লেখা আছে। এখানে একটা হয় প্লেইন সি পোর্ট

প্রায় 32-বিট সমর্থন:

সমস্ত সিটিহ্যাশ ফাংশন 64৪-বিট প্রসেসরের জন্য সুরযুক্ত। এটি বলেছে যে, তারা 32-বিট কোডে (এসএসই 4.2 ব্যবহারকারী নতুনগুলি বাদে) চালাবে। যদিও তারা খুব দ্রুত হবে না। আপনি মারমুর বা 32-বিট কোডে অন্য কিছু ব্যবহার করতে চাইতে পারেন।


11
সিটিহ্যাশ কি "সিটি সুশি" এর সাথে মিল রয়েছে?
এরিক

2
সিপহ্যাশের দিকেও নজর দিন, এটি মর্মুরহশ / সিটিহ্যাশ / ইত্যাদি প্রতিস্থাপন করা। : 131002.net/siphash
এডউইন

3
সিটিহ্যাশের উত্তরসূরী ফার্মহ্যাশও দেখুন। কোড.google.com/p/farmhash
স্টিভেনডেনিয়াল

7
xxHash সিটিহ্যাশের চেয়ে 5x দ্রুত বলে দাবি করেছে।
ক্লে ব্রিজগুলি

plain C portলিঙ্কটি নষ্ট হয়েছে
makerj

20

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

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

আলগোরিদিম মধ্যে রয়েছে: SpookyHash, CityHash, Murmur3, MD5, SHA{1,256,512}

উপসংহার:

  • নন-ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনগুলির মতো মারমুর 3, সিটিহ্যাশ এবং স্পুকির একসাথে খুব কাছাকাছি। একটি নোট করা উচিত যে সিটিএইচ এসপিই 4.2 এস CRCনির্দেশনা সহ সিপিইউগুলিতে দ্রুততর হতে পারে , যা আমার সিপিইউতে নেই। স্পুকিহ্যাশ আমার ক্ষেত্রে সিটিহ্যাশের আগে সর্বদা একটি সামান্য বিট ছিল।
  • ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনগুলি ব্যবহার করার সময় এমডি 5 একটি ভাল বাণিজ্য বলে মনে হয় যদিও SHA256 এমডি 5 এবং এসএএএ 1 এর সংঘর্ষের ঝুঁকিতে আরও সুরক্ষিত হতে পারে ।
  • সমস্ত অ্যালগরিদমের জটিলতা রৈখিক - যা অবাক হওয়ার মতো নয় কারণ তারা অবরুদ্ধভাবে কাজ করে। (আমি দেখতে চেয়েছিলাম যে পড়ার পদ্ধতিতে কোনও পার্থক্য রয়েছে কিনা, তাই আপনি কেবল সঠিক মানগুলির তুলনা করতে পারেন)।
  • SHA256 SHA512 এর চেয়ে ধীর ছিল।
  • আমি হ্যাশ ফাংশনগুলির এলোমেলোতা তদন্ত করিনি। কিন্তু এখানে হ্যাশ ফাংশন যে অনুপস্থিত একটি ভাল তুলনা হয় ইয়ান Boyds উত্তর । এটি নির্দেশ করে যে সিটিহ্যাশকে কর্নারের ক্ষেত্রে কিছু সমস্যা রয়েছে।

প্লটগুলির জন্য ব্যবহৃত উত্স:


1
লিনিয়ার স্কেল গ্রাফটি y- অক্ষ লেবেল কেটে দেয় যা বলে যে এটি কী পরিমাণে চক্রান্ত করছে। আমার ধারণা এটি সম্ভবত "সেকেন্ডে সময়" হবে, লগারিদমিক স্কেলের মতোই। এটা ঠিক করা মূল্যবান।
ক্রেগ ম্যাককুইন

18

SHA অ্যালগরিদমগুলি (SHA-256 সহ) দ্রুত হওয়ার জন্য ডিজাইন করা হয়েছে

আসলে, তাদের গতি কখনও কখনও সমস্যা হতে পারে। বিশেষত, পাসওয়ার্ড থেকে প্রাপ্ত টোকেন সংরক্ষণ করার জন্য একটি সাধারণ কৌশল হ'ল 10,000 বার স্ট্যান্ডার্ড ফাস্ট হ্যাশ অ্যালগরিদম চালানো (... পাসওয়ার্ডের হ্যাশের হ্যাশের হ্যাশের হ্যাশ সংরক্ষণ করা)।

#!/usr/bin/env ruby
require 'securerandom'
require 'digest'
require 'benchmark'

def run_random_digest(digest, count)
  v = SecureRandom.random_bytes(digest.block_length)
  count.times { v = digest.digest(v) }
  v
end

Benchmark.bmbm do |x|
  x.report { run_random_digest(Digest::SHA256.new, 1_000_000) }
end

আউটপুট:

Rehearsal ------------------------------------
   1.480000   0.000000   1.480000 (  1.391229)
--------------------------- total: 1.480000sec

       user     system      total        real
   1.400000   0.000000   1.400000 (  1.382016)

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

6
প্রশ্নটি উত্থাপিত হয়েছিল (স্পর্শকাতরভাবে, এখন এটি প্রদর্শিত হয়) ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনগুলির বিষয়। এটাই আমি সাড়া দিচ্ছি।
yfeldblum

15
"বিশেষত, পাসওয়ার্ড থেকে প্রাপ্ত টোকেন সংরক্ষণ করার জন্য একটি সাধারণ কৌশল হ'ল 10,000 বার বার একটি স্ট্যান্ডার্ড ফাস্ট হ্যাশ অ্যালগরিদম চালানো" - সাধারণ হলেও, এটি কেবল নির্লিপ্ত বোকা। এই পরিস্থিতিগুলির জন্য ডিজাইন করা অ্যালগরিদম রয়েছে, যেমন bcrypt,। সঠিক সরঞ্জামগুলি ব্যবহার করুন।
টিসি 1

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

1
@ ক্রিসমোরগান: একটি ক্রিপ্টোগ্রাফিক সুরক্ষিত হ্যাশ ব্যবহার না করে হ্যাশ টেবিল ডস হ্যাশ র্যান্ডমাইজেশন ব্যবহার করে আরও দক্ষতার সাথে সমাধান করা যেতে পারে, যাতে প্রোগ্রামগুলির প্রতিটি রান বা এমনকি প্রতিটি হ্যাশটেবলের উপরও তথ্য প্রতিবার একই বালতিতে দলবদ্ধ না হয় time ।
মিথ্যা রায়ান

14

আমি জানি SHA-256 এবং এর মতো জিনিস রয়েছে তবে এই অ্যালগরিদমগুলি সুরক্ষিত করার জন্য ডিজাইন করা হয়েছে , যার অর্থ সাধারণত এগুলি অ্যালগরিদমের চেয়ে ধীর হয় যা কম অনন্য

ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনগুলি আরও অনন্য বলে ধরে নেওয়া ভুল, এবং বাস্তবে এটি প্রায়শই অনুশীলনে পিছনের দিকে প্রদর্শিত হতে পারে। সত্যি বলতে:

  1. ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন আদর্শভাবে এলোমেলো থেকে পৃথক করা উচিত ;
  2. তবে অ-ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনগুলির সাথে, তাদের সম্ভাব্য ইনপুটগুলির সাথে অনুকূলভাবে ইন্টারঅ্যাক্ট করা বাঞ্ছনীয় ।

যার অর্থ হ'ল একটি নন-ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনটিতে "ভাল" ডেটা সেট-এর জন্য ডিজাইন করা ডেটা সেটগুলির জন্য একটি ক্রিপ্টোগ্রাফিকের চেয়ে কম সংঘর্ষ থাকতে পারে ।

আমরা বাস্তবে ইয়ান বয়েডের উত্তর এবং গণিতের কিছুটা: জন্মদিনের সমস্যায় ডেটা দিয়ে এটি প্রদর্শন করতে পারি । আপনি যদি nসেট থেকে এলোমেলোভাবে পূর্ণসংখ্যার চয়ন করেন তবে সংঘবদ্ধ জোড়গুলির প্রত্যাশিত সংখ্যার সূত্রটি [1, d]হ'ল (উইকিপিডিয়া থেকে নেওয়া):

n - d + d * ((d - 1) / d)^n

প্লাগিং n= 216,553 এবং d= 2 ^ 32 আমরা প্রায় 5.5 প্রত্যাশিত সংঘর্ষ পাই । আয়ানের পরীক্ষাগুলি প্রায়শই সেই আশেপাশের অঞ্চলে ফলাফল দেখায়, তবে একটি নাটকীয় ব্যতিক্রম সহ: বেশিরভাগ ফাংশন পরপর সংখ্যার পরীক্ষায় শূন্যের সংঘর্ষ লাভ করে। এলোমেলোভাবে 216,553 32-বিট নম্বর চয়ন এবং শূন্য সংঘর্ষ পাওয়ার সম্ভাবনা প্রায় 0.43%। এবং এটি কেবল একটি ফাংশনের জন্য — এখানে আমাদের পাঁচটি স্বতন্ত্র হ্যাশ ফাংশন পরিবার শূন্যের সাথে সংঘর্ষের সাথে রয়েছে!

সুতরাং আমরা এখানে যা দেখছি তা হ'ল যে পরীক্ষাগুলি পরীক্ষিত হ্যাশগুলি ধারাবাহিক সংখ্যার ডেটাসেটের সাথে অনুকূলভাবে ইন্টারঅ্যাক্ট করছে — অর্থাৎ, তারা আদর্শ ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনটির চেয়ে কম বিস্তৃত ইনপুটগুলি আরও বিস্তৃত করছে। (পার্শ্ব দ্রষ্টব্য: এর অর্থ হ'ল আয়ানের গ্রাফিকাল মূল্যায়ন যে এফএনভি -১ এ এবং মর্মুরহশ ২ তার কাছে "ডেথ এন্ড দ্য ডেটা" সেট করে তার নিজের ডেটা থেকে খণ্ডন করা যায় that আকারের ডেটা সেটে জিরো সংঘর্ষ, উভয় হ্যাশ ফাংশনের জন্য, খুব মারাত্মকভাবে ননরানডম!)

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

এখানে আর একটি শিক্ষামূলক তুলনা হ'ল সিআরসি এবং ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনগুলির মধ্যে নকশা লক্ষ্যগুলির মধ্যে বিপরীতে:

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

সুতরাং সিআরসি-র পক্ষে আবারও এলোমেলো চেয়ে কম সংখ্যক ভিন্ন ইনপুট সংঘর্ষ হওয়া ভাল । ক্রিপ্টো হ্যাশগুলি সহ, এটি একটি নো!


10

সিপহ্যাশ ব্যবহার করুন । এর অনেক পছন্দসই বৈশিষ্ট্য রয়েছে:

  • ফাস্ট। একটি অনুকূলিত বাস্তবায়ন বাইট প্রতি প্রায় 1 চক্র নেয়।

  • নিরাপদ. সিপহ্যাশ একটি শক্তিশালী পিআরএফ (সিউডোর্যান্ডম ফাংশন)। এর অর্থ এটি একটি এলোমেলো ফাংশন থেকে পৃথকযোগ্য (যদি আপনি 128-বিট গোপন কীটি না জানেন)। অত: পর:

    • সংঘর্ষের কারণে আপনার হ্যাশ টেবিল অনুসন্ধানগুলি রৈখিক সময় হয়ে উঠবে তা নিয়ে চিন্তা করার দরকার নেই। সিপহ্যাশ সহ, আপনি জানেন যে ইনপুট নির্বিশেষে আপনি গড় গড় কেস পারফরম্যান্স পাবেন।

    • পরিষেবা আক্রমণে হ্যাশ-ভিত্তিক অস্বীকৃতি প্রতিরোধ ক্ষমতা।

    • আপনি সিপহ্যাশ (বিশেষত 128-বিট আউটপুট সহ সংস্করণ) ম্যাক (বার্তা প্রমাণীকরণ কোড) হিসাবে ব্যবহার করতে পারেন। আপনি যদি কোনও বার্তা এবং একটি সিপহ্যাশ ট্যাগ পেয়ে থাকেন এবং ট্যাগটি আপনার গোপন কীটি দিয়ে সিপহ্যাশ চালানো থেকে সমান হয়, তবে আপনি জানেন যে যে হ্যাশ তৈরি করেছে সেও আপনার গোপন কীটি দখল করেছিল এবং বার্তাটিও নয় এবং হ্যাশ থেকে পরিবর্তন করা হয়েছে।


1
আপনার নিরাপত্তার দরকার না থাকলে সিপহ্যাশ কি ওভারকিল নয়? একটি 128-বিট কী প্রয়োজন যা কেবল গৌরবযুক্ত হ্যাশ বীজ। মর্মুরহ্যাশ 3 এর 128-বিট আউটপুট রয়েছে এবং সিপহ্যাশের কেবল একটি 64-বিট আউটপুট রয়েছে mention স্পষ্টতই বৃহত্তর ডাইজেস্টের সংঘর্ষের সুযোগ কম রয়েছে।
bryc

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

9

এটি আপনি যে ডেটা হ্যাশ করছেন তার উপর নির্ভর করে। কিছু হ্যাশিং পাঠ্যের মতো নির্দিষ্ট ডেটা দিয়ে আরও ভাল কাজ করে। কিছু হ্যাশিং অ্যালগরিদম নির্দিষ্টভাবে নির্দিষ্ট ডেটার জন্য ভাল হওয়ার জন্য ডিজাইন করা হয়েছিল।

পল শিসিহ একবার দ্রুত হ্যাশ তৈরি করেছিল । তিনি উত্স কোড এবং ব্যাখ্যা তালিকাভুক্ত। তবে এরই মধ্যে মারধর করা হয়েছিল। :)


6

জাভা এই সাধারণ বহুগুণ এবং যুক্ত অ্যালগরিদম ব্যবহার করে:

স্ট্রিং অবজেক্টের জন্য হ্যাশ কোড হিসাবে গণনা করা হয়

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

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

সম্ভবত সেখানে আরও অনেক ভাল রয়েছে তবে এটি মোটামুটি বিস্তৃত এবং গতি এবং স্বতন্ত্রতার মধ্যে একটি ভাল বাণিজ্য বলে মনে হচ্ছে।


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

4
আপনি যদি এখনও কোনও কারণে হ্যাশিংয়ের এই উপায়টি বেছে নেন তবে আপনি কমপক্ষে 92821 এর মতো আরও ভাল একটি গুণকে গুণক হিসাবে ব্যবহার করতে পারেন। এতে সংঘর্ষ অনেক কমে যায়। stackoverflow.com/a/2816747/21499
হান্স-পিটার Störr

1
এর পরিবর্তে আপনি সম্ভবত FNV1a ব্যবহার করতে পারেন। এটি একটি সাধারণ গুণ-ভিত্তিক হ্যাশ, তবে বৃহত্তর গুণক ব্যবহার করে, যা হ্যাশকে আরও ভালভাবে ছড়িয়ে দেয়।
ব্রাইক

4

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

আসল হ্যাশিং অ্যালগরিদম যতদূর যায়, আমার ব্যক্তিগত প্রিয় এফএনভি। 1

এখানে সি-তে 32-বিট সংস্করণটির একটি উদাহরণ প্রয়োগ রয়েছে:

unsigned long int FNV_hash(void* dataToHash, unsigned long int length)
{
  unsigned char* p = (unsigned char *) dataToHash;
  unsigned long int h = 2166136261UL;
  unsigned long int i;

  for(i = 0; i < length; i++)
    h = (h * 16777619) ^ p[i] ;

  return h;
}

2
এফএনভি -১ এ রূপটি এলোমেলোভাবে কিছুটা ভাল। এর ক্রমটি অদলবদল করুন *এবং ^: h = (h * 16777619) ^ p[i]==>h = (h ^ p[i]) * 16777619
আয়ান বাল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.