همانطور که معتقدم، بسیاری می دانند که از سال 2007 موسسه ملی استاندارد و فناوری ایالات متحده (NIST) مسابقه ای را برای توسعه یک الگوریتم هش برای جایگزینی SHA-1 و خانواده ای از الگوریتم های SHA-2 برگزار کرده است. با این حال، این موضوع، به دلایلی، از توجه در سایت محروم است. این در واقع چیزی است که مرا به شما رساند. من مجموعه ای از مقالات در مورد الگوریتم های هش را مورد توجه شما قرار می دهم. در این چرخه اصول اولیه توابع هش را با هم مطالعه می کنیم، معروف ترین الگوریتم های هش را در نظر می گیریم، در حال و هوای مسابقه SHA-3 فرو می رویم و الگوریتم هایی را که مدعی برنده شدن در آن هستند در نظر می گیریم، قطعا آنها را آزمایش خواهیم کرد. همچنین در صورت امکان استانداردهای هش روسی نیز در نظر گرفته خواهد شد.

در مورد خودم

دانشجوی گروه امنیت اطلاعات.

درباره هش کردن

در حال حاضر، تقریباً هیچ برنامه رمزنگاری بدون استفاده از هش کامل نمی شود.
توابع هش توابعی هستند که برای فشرده سازی یک پیام دلخواه یا مجموعه ای از داده ها، که معمولاً با الفبای دودویی نوشته می شوند، در یک الگوی بیت با طول ثابت به نام کانولوشن طراحی شده اند. توابع هش در هنگام انجام آزمایش های آماری، هنگام آزمایش دستگاه های منطقی، هنگام ساخت الگوریتم هایی برای جستجوی سریع و بررسی یکپارچگی رکوردها در پایگاه های داده کاربردهای مختلفی دارند. نیاز اصلی برای توابع هش یکنواختی توزیع مقادیر آنها با انتخاب تصادفی مقادیر آرگومان است.
یک تابع هش رمزنگاری، هر تابع هش است که از نظر رمزنگاری ایمن است، یعنی تعدادی از الزامات خاص برنامه های رمزنگاری را برآورده می کند. در رمزنگاری، از توابع هش برای حل مشکلات زیر استفاده می شود:
- ایجاد سیستم های کنترل یکپارچگی داده ها در حین انتقال یا ذخیره سازی آنها،
- احراز هویت منبع داده

تابع هش هر تابعی است h:X -> Y، به راحتی قابل محاسبه و به گونه ای است که برای هر پیامی ممعنی h(M) = H (پیچیدگی)طول بیت ثابتی دارد. ایکس- مجموعه ای از تمام پیام ها، Y- مجموعه ای از بردارهای دوتایی با طول ثابت.

به عنوان یک قاعده، توابع هش بر اساس به اصطلاح توابع انقباض یک مرحله ای ساخته می شوند y \u003d f (x 1، x 2)دو متغیر، جایی که x 1, x2و y- بردارهای طول باینری متر, nو nبه ترتیب و nطول پیچش است و متر- طول بلوک پیام
برای بدست آوردن ارزش h (M)پیام ابتدا به بلوک های طولی تقسیم می شود متر(در عین حال، اگر طول پیام مضرب نباشد مترسپس آخرین بلوک به روشی خاص به بلوک کامل تکمیل می شود) و سپس به بلوک های دریافتی M 1 , M 2 ,..., M Nروش متوالی زیر را برای محاسبه پیچیدگی اعمال کنید:

H o \u003d v،
H i = f(M i،H i-1)، i = 1،..، N،
h(M) = H N

اینجا v- مقداری ثابت، اغلب به آن بردار مقداردهی اولیه می گویند. او خارج می شود
به دلایل مختلف و می تواند یک ثابت مخفی یا مجموعه ای از داده های تصادفی باشد (مثلاً انتخاب تاریخ و زمان).
با این رویکرد، ویژگی های تابع هش به طور کامل توسط ویژگی های تابع انقباض یک مرحله ای تعیین می شود.

دو نوع مهم توابع هش رمزنگاری وجود دارد - کلیددار و بدون کلید. توابع هش کلید، کدهای احراز هویت پیام نامیده می شوند. آنها این امکان را فراهم می کنند که بدون ابزار اضافی، هم صحت منبع داده و هم یکپارچگی داده ها را در سیستم هایی با کاربران قابل اعتماد متقابل تضمین کنند.
توابع هش بدون کلید، کدهای تشخیص خطا نامیده می شوند. آنها با کمک ابزارهای اضافی (مثلاً رمزگذاری) تضمین یکپارچگی داده ها را ممکن می سازند. این توابع هش را می توان در سیستم هایی با کاربران قابل اعتماد و غیر قابل اعتماد استفاده کرد.

درباره خصوصیات و الزامات آماری

همانطور که گفتم، نیاز اصلی برای توابع هش توزیع یکنواخت مقادیر آنها با انتخاب تصادفی مقادیر آرگومان است. برای توابع هش رمزنگاری، همچنین مهم است که با کوچکترین تغییر در آرگومان، مقدار تابع به شدت تغییر کند. این اثر بهمن نامیده می شود.

به توابع کلیدیهش کردن شرایط زیر را دارد:
- عدم امکان ساخت
- عدم امکان اصلاح

شرط اول به این معنی است که تطبیق یک پیام با مقدار فولد صحیح بسیار دشوار است. دوم پیچیدگی بالای تطبیق برای یک پیام معین با یک مقدار فولد مشخص، پیام دیگری با مقدار فولد صحیح است.

الزامات توابع بدون کلید عبارتند از:
- یک طرفه،
- مقاومت در برابر برخورد،
- مقاومت در برابر یافتن نمونه اولیه.

تک جهتی به عنوان پیچیدگی بالای یافتن یک پیام توسط یک مقدار پیچیدگی معین درک می شود. لازم به ذکر است که در این لحظههیچ توابع هش در استفاده با یک طرفه اثبات شده وجود ندارد.
مقاومت در برابر برخورد به عنوان دشواری یافتن یک جفت پیام با مقادیر برابر یکسان درک می شود. معمولاً، یافتن راهی برای ایجاد برخورد توسط تحلیلگران رمز است که به عنوان اولین سیگنال از منسوخ شدن الگوریتم و نیاز به جایگزینی سریع آن عمل می کند.
مقاومت در برابر یافتن دومین تصویر اولیه به عنوان دشواری یافتن پیام دوم با همان مقدار فولد برای یک پیام معین با مقدار فولد شناخته شده درک می شود.

این بخش تئوری بود که در آینده برای ما مفید خواهد بود ...

درباره الگوریتم های هش محبوب

الگوریتم ها CRC16/32- چک جمع (و نه تبدیل رمزنگاری شده).

الگوریتم ها MD2/4/5/6. آنها آفرینش ران ریوست، یکی از نویسندگان الگوریتم RSA هستند.
الگوریتم MD5 زمانی بسیار محبوب بود، اما اولین پیش نیازهای هک در اواخر دهه نود ظاهر شد و اکنون محبوبیت آن به سرعت در حال کاهش است.
الگوریتم MD6 از منظر سازنده الگوریتم بسیار جالبی است. برای رقابت SHA-3 نامزد شد، اما متأسفانه نویسندگان نتوانستند آن را به استاندارد برسانند و این الگوریتم در لیست نامزدهای راه یافته به دور دوم نیست.

الگوریتم های خط کش SHAالگوریتم هایی که امروزه بسیار مورد استفاده قرار می گیرند. یک انتقال فعال از استانداردهای نسخه SHA-1 به SHA-2 وجود دارد. SHA-2 نام جمعی الگوریتم های SHA224، SHA256، SHA384 و SHA512 است. SHA224 و SHA384 اساساً به ترتیب مشابه SHA256 و SHA512 هستند، تنها پس از محاسبه پیچیدگی، برخی از اطلاعات موجود در آن دور ریخته می شوند. آنها باید فقط برای اطمینان از سازگاری با مدل های قدیمی تر تجهیزات استفاده شوند.

استاندارد روسی - GOST 34.11-94.

در مقاله بعدی

مروری بر الگوریتم های MD (MD4، MD5، MD6).

ادبیات

A. P. Alferov، مبانی رمزنگاری.

بروس اشنایر، رمزنگاری کاربردی.

هش کردن یک روش خاص برای آدرس دهی داده ها است (نوعی الگوریتم فاصله گذاری) با کلیدهای منحصر به فردشان ( کلید ) تا به سرعت اطلاعات مورد نیاز خود را پیدا کنید.

مفاهیم اساسی

جدول هش

جدول هش یک آرایه منظم با آدرس خاصی است که توسط یک تابع (تابع هش) داده می شود.

تابع هش

تابعی که کلید یک آیتم داده را به برخی از شاخص های جدول تبدیل می کند ( جدول هش)، نامیده میشود تابع هش یا تابع هش :

من = ساعت (کلید );

جایی که کلید- کلید قابل تبدیل، من- نمایه جدول حاصل، یعنی. کلید در مجموعه ای از مثلاً اعداد صحیح نمایش داده می شود ( آدرس های هش ) که بعداً برای دسترسی به داده ها استفاده می شوند.

هش کردن به این روش تکنیکی است که شامل استفاده از مقدار یک کلید برای تعیین موقعیت آن در یک جدول خاص است.

با این حال، تابع گسترش می تواند چندین مقادیر کلیدی منحصر به فرد، همان مقدار موقعیت را می دهد من در جدول هش وضعیتی که در آن دو یا چند کلید یک شاخص (آدرس هش) را دریافت می کنند نامیده می شود برخورد (برخورد) در هش کردن.بنابراین، طرح هش باید شامل شود الگوریتم حل تعارض ، تعریف ترتیب اقدامات، اگر موقعیت من=ساعت(کلید) قبلاً توسط یک ورودی با یک کلید متفاوت اشغال شده است.

طرح های هش زیادی وجود دارد که در تابع هش مورد استفاده متفاوت است. ساعت(کلید) و الگوریتم های حل تعارض.

متداول ترین روش برای تعیین یک تابع هش عبارت است از: روش تقسیم

داده های اولیه عبارتند از: - تعدادی کلید عدد صحیح کلیدو اندازه میز متر. نتیجه این تابع باقیمانده تقسیم این کلید بر اندازه جدول است. شکل کلی چنین تابعی در زبان برنامه نویسی C/C++:

بین المللی ساعت (بین المللی کلید , بین المللی متر ) {

برای متر= 10 تابع هش کمترین رقم کلید را برمی گرداند.

برای m=100، تابع هش دو رقم کم اهمیت کلید را برمی گرداند.

در مثال های در نظر گرفته شده، تابع هش من=ساعت(کلید) فقط موقعیتی را مشخص می کند که از آن ورودی را با کلید جستجو کنید (یا در ابتدا در جدول قرار دهید). کلید. در مرحله بعد، باید از نوعی طرح هش (الگوریتم) استفاده کنید.

طرح های درهم سازی

در اکثر مشکلات، دو یا چند کلید به یک شکل هش می شوند، اما نمی توانند سلول یکسانی را در جدول هش اشغال کنند. دو تا هستند گزینه های ممکن: یا یک موقعیت متفاوت برای کلید جدید پیدا کنید، یا یک لیست جداگانه برای هر فهرست جدول هش ایجاد کنید، که در آن همه کلیدهای نگاشت شده به این شاخص قرار می گیرند.

این انواع دو طرح هش کلاسیک هستند:

    هش کردن با آدرس دهی باز با کاوش خطی - خطی پویشگر باز کن خطاب به.

    هش زنجیره ای (با لیست) یا به اصطلاح هش چند بعدی - زنجیر زدن با جداگانه، مجزا لیست ها;

روش آدرس دهی باز با کاوش خطی . در ابتدا، تمام سلول های جدول هش، که یک آرایه یک بعدی منظم است، به عنوان خالی علامت گذاری می شوند. بنابراین، هنگام افزودن یک کلید جدید، بررسی می شود که آیا سلول داده شده اشغال شده است یا خیر. اگر سلول اشغال شده باشد، الگوریتم در یک دایره جستجو می کند تا جایی که یک فضای خالی ("آدرس باز") وجود داشته باشد.

آن ها عناصر با کلیدهای همگن در نزدیکی شاخص حاصل قرار می گیرند.

در آینده، با انجام جستجو، ابتدا موقعیت را با کلید پیدا کنید مندر جدول، و اگر کلید مطابقت نداشته باشد، جستجوی بعدی مطابق با الگوریتم حل تعارض انجام می شود و از موقعیت شروع می شود من. .

روش زنجیره ای استراتژی غالب است . در این مورد مناز تابع هش انتخاب شده به دست آمده است ساعت(کلید)=من، به عنوان یک شاخص در یک جدول هش از لیست ها، یعنی. ابتدا کلید کلیدورودی بعدی به موقعیت نگاشت می شود من = ساعت(کلید) جداول اگر موقعیت آزاد باشد، عنصر با کلید در آن قرار می گیرد. کلید، اگر مشغول باشد، یک الگوریتم حل تعارض ایجاد می شود، در نتیجه چنین کلیدهایی در لیستی قرار می گیرند که با شروع از من-آن سلول جدول هش. مثلا

در نتیجه، جدولی از آرایه‌ای از فهرست‌ها یا درخت‌های مرتبط داریم.

فرآیند پر کردن (خواندن) جدول هش ساده است، اما دسترسی به عناصر به عملیات زیر نیاز دارد:

محاسبه شاخص من;

در زنجیره مربوطه جستجو کنید.

برای بهبود جستجو هنگام افزودن یک عنصر جدید، می‌توانید از الگوریتم درج نه در انتهای لیست، بلکه با ترتیب، استفاده کنید. افزودن عنصر به جای مناسب.

نمونه ای از اجرای روش آدرس دهی مستقیم با کاوش خطی . داده های اولیه 7 رکورد هستند (برای سادگی، بخش اطلاعات فقط از داده های عدد صحیح تشکیل شده است)، از نوع ساختاری اعلام شده:

کلید ورودی؛ // کلید

اطلاعات // اطلاعات

(59.1)، (70.3)، (96.5)، (81.7)، (13.8)، (41.2)، (79.9); اندازه جدول هش m=10.

تابع هش من=ساعت(داده ها) =داده ها.کلیدده درصد آن ها باقیمانده پس از تقسیم بر 10 - من.

بر اساس داده های اولیه، جدول هش را به ترتیب پر می کنیم.

با هش کردن پنج کلید اول، ایندکس های مختلف (آدرس هش) به دست می آید:

اولین برخورد بین کلیدهای 81 و 41 رخ می دهد - مکان با شاخص 1 اشغال شده است. بنابراین، ما از طریق جدول هش نگاه می کنیم تا نزدیکترین فضای آزاد را پیدا کنیم، در این مورد چنین است من = 2.

کلید بعدی 79 نیز یک برخورد ایجاد می کند: موقعیت 9 قبلاً اشغال شده است. کارایی الگوریتم به شدت کاهش می یابد، زیرا برای یافتن یک مکان رایگان، 6 آزمایش (مقایسه) طول کشید، شاخص معلوم شد که رایگان است من= 4.

تعداد کل نمونه های این روش از 1 تا n-1 نمونه در هر عنصر است که n اندازه جدول هش است.

اجرای روش زنجیر زنی برای مثال قبلی یک نوع ساختاری برای یک عنصر لیست (یک جهته) اعلام می کنیم:

کلید ورودی؛ // کلید

اطلاعات // اطلاعات

zap*بعدی؛ // اشاره گر به عنصر بعدیدر لیست

بر اساس داده های اولیه، جدول هش را به ترتیب با اضافه کردن پر می کنیم عنصر جدیداگر مکان قبلاً گرفته شده باشد به انتهای لیست بروید.

هش کردن پنج کلید اول، مانند مورد قبلی، نمایه های مختلفی (آدرس هش) به دست می دهد: 9، 0، 6، 1 و 3.

هنگامی که یک برخورد رخ می دهد، عنصر جدید به انتهای لیست اضافه می شود. بنابراین عنصر با کلید 41 بعد از عنصر با کلید 81 و عنصر با کلید 79 بعد از عنصر با کلید 59 قرار می گیرد.

وظایف فردی

1. درختان دوتایی.با استفاده از برنامه تولید اعداد تصادفی، 10 مقدار از 1 تا 99 را بدست آورید و یک درخت باینری بسازید.

انحراف ایجاد کنید:

1.a پیمایش از چپ به راست: Left-Root-Right: ابتدا از زیر درخت سمت چپ، سپس ریشه و در نهایت زیر درخت سمت راست بازدید کنید.

(یا برعکس، از راست به چپ: راست-ریشه-چپ)

1.b پیمایش از بالا به پایین: ریشه-چپ-راست: از ریشه به زیر درختان بازدید کنید.

1.در پیمایش از پایین به بالا: Left-Right-Root: از ریشه پس از زیردرخت دیدن کنید

در طیف گسترده ای از صنایع فناوری اطلاعاتتوابع هش کاربرد آنها را پیدا کنید. آنها از یک طرف برای ساده کردن تبادل داده بین کاربران و پردازش فایل های مورد استفاده برای اهداف خاص طراحی شده اند، از طرف دیگر برای بهینه سازی الگوریتم ها برای اطمینان از کنترل دسترسی به منابع مربوطه. تابع هش یکی از ابزارهای کلیدیتضمین حفاظت از رمز عبور داده ها، و همچنین سازماندهی تبادل اسناد امضا شده با استفاده از EDS. استانداردهای زیادی وجود دارد که توسط آنها می توان فایل ها را کش کرد. بسیاری از آنها توسط متخصصان روسی توسعه یافته اند. انواع توابع هش چیست؟ مکانیسم های اصلی برای کاربرد عملی آنها چیست؟

آن چیست؟

ابتدا، بیایید مفهوم تابع هش را بررسی کنیم. این اصطلاح معمولاً به عنوان الگوریتمی برای تبدیل مقدار معینی از اطلاعات به دنباله کوتاه‌تری از کاراکترها با استفاده از روش‌های ریاضی شناخته می‌شود. اهمیت عملی تابع هش را می توان در زمینه های مختلفی دنبال کرد. بنابراین، می توان از آنها هنگام بررسی یکپارچگی فایل ها و برنامه ها استفاده کرد. همچنین از توابع هش رمزنگاری در الگوریتم های رمزنگاری استفاده می شود.

مشخصات

اجازه دهید ویژگی های کلیدی الگوریتم های مورد مطالعه را در نظر بگیریم. میان اینها:

  • وجود الگوریتم های داخلی برای تبدیل داده های طول اصلی به دنباله کوتاه تری از کاراکترها.
  • باز بودن برای تأیید رمزنگاری؛
  • وجود الگوریتم هایی که به شما امکان می دهد داده های اصلی را به طور ایمن رمزگذاری کنید.
  • سازگاری با رمزگشایی با استفاده از کوچک قدرت پردازش.

سایر ویژگی های مهم تابع هش عبارتند از:

  • توانایی پردازش آرایه های داده اولیه با طول دلخواه؛
  • تولید بلوک های هش شده با طول ثابت.
  • مقادیر تابع را در خروجی به طور مساوی توزیع کنید.

الگوریتم های مورد بررسی نیز حساسیت به داده های ورودی را در سطح 1 بیتی فرض می کنند. یعنی حتی اگر به طور نسبی حداقل 1 حرف در سند منبع تغییر کند، عملکرد هش متفاوت به نظر می رسد.

الزامات برای توابع هش

تعدادی الزامات برای توابع هش در نظر گرفته شده برای استفاده عملی در یک منطقه خاص وجود دارد. ابتدا الگوریتم مربوطه باید نسبت به تغییرات ساختار داخلی اسناد هش شده حساس باشد. به این معنا که تابع هش باید زمانی که به آن می رسد شناسایی شود فایل متنی، جایگشت پاراگراف، خط فاصله. از یک طرف محتوای سند تغییر نمی کند، از طرف دیگر ساختار آن اصلاح می شود و این فرآیند باید در هنگام هش شناسایی شود. ثانیاً، الگوریتم مورد بررسی باید داده ها را به گونه ای تبدیل کند که عملیات معکوس (تبدیل هش به سند اصلی) در عمل غیرممکن باشد. ثالثاً، تابع هش باید شامل استفاده از چنین الگوریتم هایی باشد که عملاً امکان تشکیل همان دنباله کاراکترها را به صورت هش و به عبارت دیگر ظاهر شدن به اصطلاح برخوردها را حذف می کند. ذات آنها را کمی بعد در نظر خواهیم گرفت.

الزامات ذکر شده که الگوریتم تابع هش باید برآورده کند، عمدتاً از طریق استفاده از رویکردهای پیچیده ریاضی قابل دستیابی است.

ساختار

اجازه دهید مطالعه کنیم که ساختار توابع در نظر گرفته شده چگونه می تواند باشد. همانطور که در بالا اشاره کردیم، یکی از الزامات اصلی برای الگوریتم های مورد بررسی، ارائه رمزگذاری یک جهته است. فردی که فقط یک هش در اختیار دارد عملا نباید بتواند بر اساس آن اصل سند را دریافت کند.

در چه ساختاری می توان یک تابع هش را که برای چنین اهدافی استفاده می شود نشان داد؟ نمونه ای از کامپایل آن می تواند به شرح زیر باشد: H (هش، یعنی هش) = f (T (متن)، H1)، که در آن H1 الگوریتم پردازش متن T است. این تابعهش T را به گونه ای انجام می دهد که بدون اطلاع از H1 عملاً باز کردن آن به عنوان یک فایل کامل غیرممکن خواهد بود.

استفاده از توابع هش در عمل: دانلود فایل ها

اجازه دهید اکنون با جزئیات بیشتری گزینه های استفاده از توابع هش را در عمل مطالعه کنیم. هنگام نوشتن اسکریپت برای دانلود فایل ها از سرورهای اینترنتی می توان از الگوریتم های مناسب استفاده کرد.

در بیشتر موارد، یک چک‌سوم مشخص برای هر فایل تعیین می‌شود - این هش است. باید برای یک شی واقع در سرور و دانلود در رایانه کاربر یکسان باشد. اگر اینطور نیست، ممکن است فایل باز نشود یا اشتباه شروع شود.

عملکرد هش و امضای دیجیتال

استفاده از توابع هش در سازماندهی تبادل اسناد حاوی امضای دیجیتال رایج است. در این حالت فایل امضا شده هش می شود تا گیرنده آن بتواند از اصل بودن آن اطمینان حاصل کند. اگرچه تابع هش به طور رسمی در ساختار گنجانده نشده است کلید الکترونیکی، می توان آن را در حافظه فلش سخت افزاری که اسناد با آن امضا می شود ، مانند eToken ثابت کرد.

امضای الکترونیکی رمزگذاری یک فایل با استفاده از کلیدهای عمومی و خصوصی است. یعنی یک پیام رمزگذاری شده با کلید خصوصی به فایل منبع پیوست می شود و امضای دیجیتال با استفاده از کلید عمومی. اگر عملکرد هش هر دو سند مطابقت داشته باشد، فایل گیرنده معتبر شناخته می شود و امضای فرستنده صحیح تشخیص داده می شود.

هش کردن، همانطور که در بالا اشاره کردیم، مستقیماً جزء EDS نیست، با این حال، به شما اجازه می دهد تا الگوریتم ها را برای استفاده بسیار موثر بهینه کنید. امضای الکترونیک. بنابراین، فقط هش می تواند رمزگذاری شود، نه خود سند. در نتیجه، سرعت پردازش فایل به طور قابل توجهی افزایش می یابد، و در عین حال می توان مکانیسم های حفاظتی موثرتری EDS را فراهم کرد، زیرا تاکید در عملیات محاسباتی در این مورد نه بر پردازش داده های اولیه، بلکه بر اطمینان از قدرت رمزنگاری امضا تابع هش همچنین امکان امضای انواع داده‌ها و نه فقط متن را فراهم می‌کند.

جستجوگر رمز عبور

یکی دیگر از زمینه های ممکن برای کاربرد هش، سازماندهی الگوریتم های تأیید رمز عبور است که برای تمایز دسترسی به منابع فایل خاص ایجاد شده است. چگونه می توان انواع خاصی از توابع هش را در حل چنین مشکلاتی درگیر کرد؟ بسیار ساده.

واقعیت این است که در اکثر سرورهایی که دسترسی به آنها مشروط به تمایز است، رمزهای عبور به شکل مقادیر هش ذخیره می شوند. این کاملاً منطقی است - اگر گذرواژه‌ها به شکل متن اصلی خود ارائه می‌شدند، هکرهایی که به آنها دسترسی پیدا می‌کردند به راحتی می‌توانستند داده‌های مخفی را بخوانند. به نوبه خود، بر اساس هش، محاسبه رمز عبور آسان نیست.

هنگام استفاده از الگوریتم های مورد بررسی چگونه دسترسی کاربر بررسی می شود؟ رمز عبور وارد شده توسط کاربر با آنچه در یک تابع هش ذخیره شده در سرور ثابت شده است بررسی می شود. اگر مقادیر بلوک های متن مطابقت داشته باشند، کاربر دسترسی لازم به منابع را دریافت می کند.

ساده ترین تابع هش را می توان به عنوان ابزار بررسی رمز عبور استفاده کرد. اما در عمل، متخصصان فناوری اطلاعات اغلب از الگوریتم های رمزنگاری چند مرحله ای پیچیده استفاده می کنند. به طور معمول، آنها با استفاده از استانداردهای ارتباطی کانال امن تکمیل می شوند تا هکرها نتوانند رمز عبور ارسال شده از رایانه کاربر به سرورها را قبل از تأیید در برابر بلوک های متن هش شده شناسایی یا کشف کنند.

برخورد توابع هش

در تئوری توابع هش، پدیده ای مانند برخورد ارائه شده است. جوهر آن چیست؟ برخورد هش وضعیتی است که در آن دو فایل مختلف دارای کد هش یکسان هستند. این در صورتی امکان پذیر است که طول دنباله کاراکتر هدف کوچک باشد. در این صورت احتمال تطبیق هش بیشتر خواهد بود.

به منظور جلوگیری از برخورد، به ویژه توصیه می شود از یک الگوریتم دوگانه به نام "هش تابع هش" استفاده کنید. این شامل تشکیل کد باز و بسته است. بسیاری از برنامه نویسان در حل مسائل بحرانی توصیه می کنند در مواردی که لازم نیست از توابع هش استفاده نکنید و همیشه الگوریتم های مربوطه را برای بهترین سازگاری با کلیدهای خاص آزمایش کنید.

تاریخچه ظهور

بنیانگذاران نظریه توابع هش را می توان محققان کارتر، وگمن، سیمونسون، بیربروئر دانست. در نسخه‌های اول، الگوریتم‌های مربوطه به‌عنوان ابزاری برای تولید تصاویر منحصربه‌فرد از دنباله‌های کاراکتر با طول دلخواه با هدف بعدی شناسایی و تأیید صحت آنها استفاده شد. به نوبه خود، هش، مطابق با معیارهای مشخص شده، باید دارای طول 30-512 بیت باشد. به عنوان خاص دارایی مفیدتوابع مناسب، مناسب بودن آن برای استفاده به عنوان منبعی برای جستجوی سریع فایل ها یا مرتب سازی آنها در نظر گرفته شد.

استانداردهای هش محبوب

اکنون اجازه دهید در نظر بگیریم که توابع هش در چه استانداردهای محبوبی می توانند نمایش داده شوند. یکی از آنها CRC است. این الگوریتم است کد چرخه ای، همچنین چکسام نامیده می شود. این استاندارد با سادگی و در عین حال تطبیق پذیری مشخص می شود - از طریق آن می توانید گسترده ترین طیف داده ها را هش کنید. CRC یکی از رایج ترین الگوریتم های غیر رمزنگاری است.

به نوبه خود، استانداردهای MD4 و MD5 به طور گسترده در رمزگذاری استفاده می شوند. یکی دیگر از الگوریتم های رمزنگاری محبوب SHA-1 است. به طور خاص، با اندازه هش 160 بیت مشخص می شود که بزرگتر از MD5 است - این استاندارد از 128 بیت پشتیبانی می کند. استانداردهای روسی وجود دارد که استفاده از توابع هش را تنظیم می کند - GOST R 34.11-94، و همچنین GOST R 34.11-2012 که جایگزین آن شده است. می توان اشاره کرد که مقدار هش ارائه شده توسط الگوریتم های اتخاذ شده در فدراسیون روسیه 256 بیت است.

استانداردهای مورد بحث را می توان به روش های مختلفی طبقه بندی کرد. به عنوان مثال، کسانی هستند که از الگوریتم های بلوکی و تخصصی استفاده می کنند. سادگی محاسبات بر اساس استانداردهای نوع اول اغلب با سرعت کم آنها همراه است. بنابراین، به عنوان جایگزینی برای الگوریتم های بلوکی، می توان از الگوریتم هایی استفاده کرد که شامل مقدار کمتری از عملیات محاسباتی ضروری هستند. مرسوم است که به استانداردهای سرعت بالا، به ویژه MD4، MD5 و SHA که در بالا ذکر شد، رجوع شود. بیایید ویژگی های الگوریتم های هش ویژه در مثال SHA را با جزئیات بیشتری در نظر بگیریم.

ویژگی های الگوریتم SHA

استفاده از توابع هش بر اساس استاندارد SHA اغلب در زمینه توسعه ابزار انجام می شود امضای دیجیتالیاسناد DSA همانطور که در بالا اشاره کردیم، الگوریتم SHAاز هش 160 بیتی پشتیبانی می کند (به اصطلاح "هضم" یک دنباله از کاراکترها را ارائه می دهد). در ابتدا، استاندارد مورد بررسی، آرایه داده را به بلوک های 512 بیتی تقسیم می کند. در صورت لزوم، اگر طول آخرین بلوک به رقم مشخص شده نرسد، ساختار فایل با 1 و تعداد صفرهای مورد نیاز پر می شود. همچنین در انتهای بلوک مربوطه کدی وارد می شود که طول پیام را مشخص می کند. الگوریتم مورد بررسی شامل 80 تابع منطقی است که از طریق آنها 3 کلمه پردازش می شود که در 32 بیت نمایش داده می شود. استاندارد SHA همچنین استفاده از 4 ثابت را در نظر گرفته است.

مقایسه الگوریتم های هش

بیایید با استفاده از مثال مقایسه ویژگی های استاندارد روسی GOST R 34.11-94 و SHA آمریکایی که در بالا بررسی کردیم، چگونگی ارتباط ویژگی های توابع هش مربوط به استانداردهای مختلف را مطالعه کنیم. اول از همه، لازم به ذکر است که الگوریتم توسعه یافته در فدراسیون روسیه شامل اجرای 4 عملیات رمزگذاری در هر 1 چرخه است. این مربوط به 128 دور است. به نوبه خود، در طول 1 دور، هنگام استفاده از SHA، انتظار می رود که حدود 20 دستور محاسبه شود، در حالی که در مجموع 80 دور وجود دارد.بنابراین، استفاده از SHA امکان پردازش 512 بیت از داده های اولیه را در یک چرخه فراهم می کند. در حالی که استاندارد روسی قادر به انجام عملیات در چرخه 256 بیت داده است.

مشخصات آخرین الگوریتم روسی

در بالا، ما اشاره کردیم که استاندارد GOST R 34.11-94 با یک جدیدتر جایگزین شد - GOST R 34.11-2012 Stribog. بیایید جزئیات آن را با جزئیات بیشتری بررسی کنیم.

از طریق این استانداردمی توان مانند الگوریتم های مورد بحث در بالا، توابع هش رمزنگاری را پیاده سازی کرد. می توان اشاره کرد که آخرین استاندارد روسی از بلوکی از داده های ورودی به مقدار 512 بیت پشتیبانی می کند. مزایای اصلی GOST R 34.11-2012:

  • سطح بالایی از محافظت در برابر شکستن رمزها؛
  • قابلیت اطمینان، با استفاده از طرح های اثبات شده؛
  • محاسبه سریع تابع هش، عدم وجود تغییر شکل در الگوریتم که ساخت تابع را پیچیده می کند و محاسبه را کند می کند.

مزایای استاندارد جدید روسیه ذکر شده است رمزگذاری رمزنگاریبه شما این امکان را می دهد که از آن در سازماندهی گردش کار استفاده کنید که دقیق ترین معیارها را که در مفاد قانون نظارتی مقرر شده است مطابقت دارد.

ویژگی توابع هش رمزنگاری

اجازه دهید با جزئیات بیشتری در نظر بگیریم که چگونه می توان از انواع الگوریتم های مورد مطالعه در زمینه رمزنگاری استفاده کرد. نیاز کلیدی برای عملکردهای مربوطه مقاومت در برابر برخورد است که در بالا به آن اشاره کردیم. یعنی اگر این مقادیر قبلاً در ساختار الگوریتم همسایه وجود داشته باشد، مقادیر هش تکراری نباید تولید شود. سایر معیارهای ذکر شده در بالا نیز باید توسط توابع رمزنگاری برآورده شوند. واضح است که همیشه امکان تئوریک بهبودی وجود دارد منبع فایلبر اساس هش، به خصوص اگر ابزار محاسباتی قدرتمندی در دسترس باشد. با این حال، قرار است این سناریو به لطف الگوریتم های رمزگذاری قوی به حداقل برسد. بنابراین، اگر قدرت محاسباتی آن با فرمول 2^(n/2) مطابقت داشته باشد، محاسبه تابع هش بسیار دشوار خواهد بود.

یکی دیگر از معیارهای مهم برای الگوریتم رمزنگاری، تغییر در هش در صورت اصلاح آرایه داده اولیه است. در بالا، اشاره کردیم که استانداردهای رمزگذاری باید در سطح 1 بیت حساسیت داشته باشند. بنابراین، این ویژگی یک عامل کلیدی در تضمین حفاظت از رمز عبور قابل اعتماد برای دسترسی به فایل ها است.

طرح های تکرار شونده

اجازه دهید اکنون نحوه ساخت الگوریتم های هش رمزنگاری را مطالعه کنیم. یکی از رایج ترین طرح ها برای حل این مشکل استفاده از یک مدل ترتیبی تکرار شونده است. این مبتنی بر استفاده از تابع به اصطلاح انقباض است که در آن تعداد بیت های ورودی به طور قابل توجهی بیشتر از آنهایی است که در خروجی ثابت می شوند.

البته تابع فشرده سازی باید معیارهای قدرت رمزنگاری لازم را داشته باشد. در طرح تعاملی، اولین عملیات برای پردازش جریان داده های ورودی به بلوک هایی تقسیم می شود که اندازه آنها بر حسب بیت محاسبه می شود. الگوریتم مربوطه نیز از متغیرهای موقت تعداد معینی از بیت ها استفاده می کند. یک عدد شناخته شده به عنوان اولین مقدار استفاده می شود، در حالی که بلوک های بعدی داده با مقدار تابع مورد نظر در خروجی ترکیب می شوند. مقدار هش به بیت خروجی برای آخرین تکرار تبدیل می شود که کل جریان ورودی از جمله مقدار اول را در نظر می گیرد. به اصطلاح "اثر بهمنی" هش ارائه شده است.

مشکل اصلی که هش اجرا شده را به عنوان یک طرح تکراری مشخص می کند این است که ساخت توابع هش گاهی دشوار است اگر جریان ورودی با اندازه بلوکی که آرایه داده اولیه به آن تقسیم شده است یکسان نباشد. اما در این حالت می توان الگوریتم هایی را در استاندارد هش نوشت که به وسیله آن می توان جریان اصلی را به هر طریقی گسترش داد.

در برخی موارد، به اصطلاح الگوریتم های چند گذر ممکن است در فرآیند پردازش داده ها در چارچوب یک طرح تکرار شونده دخیل باشند. آنها تشکیل یک "اثر بهمن" حتی شدیدتر را پیشنهاد می کنند. چنین سناریویی شامل تشکیل آرایه های داده های مکرر است و تنها در وهله دوم گسترش است.

الگوریتم بلوک

تابع فشرده سازی همچنین ممکن است بر اساس یک الگوریتم بلوکی باشد که توسط آن رمزگذاری انجام می شود. بنابراین، برای افزایش سطح امنیت، می‌توانید از بلوک‌هایی از داده‌هایی که در تکرار جاری در معرض هش هستند، به‌عنوان کلید و نتیجه عملیات به‌دست‌آمده در حین اجرای عملکرد فشرده‌سازی قبل از آن، به‌عنوان ورودی استفاده کنید. . در نتیجه، آخرین تکرار خروجی الگوریتم را ارائه خواهد کرد. امنیت یک هش با استحکام الگوریتم درگیر ارتباط دارد.

با این حال، همانطور که در بالا اشاره کردیم، با توجه به انواع مختلفتوابع هش، الگوریتم های بلوک اغلب با نیاز به استفاده از قدرت محاسباتی بزرگ همراه هستند. اگر آنها در دسترس نباشند، سرعت پردازش فایل ممکن است برای حل مشکلات عملی مربوط به استفاده از توابع هش کافی نباشد. در عین حال، قدرت رمزنگاری مورد نیاز را نیز می توان با تعداد کمی از عملیات با جریان های داده منبع تحقق بخشید، به ویژه، الگوریتم های در نظر گرفته شده توسط ما - MD5، SHA، استانداردهای رمزگذاری رمزنگاری روسیه - برای حل چنین مشکلاتی سازگار هستند.

هش چیست؟یک تابع هش تبدیل ریاضی اطلاعات به یک رشته کوتاه با طول معین است.

چرا این مورد نیاز است؟تجزیه و تحلیل تابع هش اغلب برای بررسی یکپارچگی فایل های مهم استفاده می شود سیستم عامل، برنامه های مهم، داده های مهم. نظارت را می توان هم بر اساس نیاز و هم به صورت منظم انجام داد.

چگونه انجام می شود؟ابتدا، یکپارچگی فایل هایی را که نیاز به نظارت دارند مشخص کنید. برای هر فایل، مقدار هش آن طبق الگوریتم خاصی محاسبه می شود و نتیجه ذخیره می شود. پس از گذشت زمان لازم، محاسبه مشابهی انجام شده و نتایج با هم مقایسه می شوند. اگر مقادیر متفاوت باشد، اطلاعات موجود در فایل تغییر کرده است.

یک تابع هش چه ویژگی هایی باید داشته باشد؟

  • باید بتواند داده های با طول دلخواه را به یک داده ثابت تبدیل کند.
  • باید یک الگوریتم باز داشته باشد تا قدرت رمزنگاری آن قابل بررسی باشد.
  • باید یک طرفه باشد، یعنی امکان ریاضی برای تعیین داده های اولیه از نتیجه وجود نداشته باشد.
  • باید در برابر برخورد «مقاومت کند»، یعنی نباید مقادیر یکسانی برای داده های ورودی مختلف تولید کند.
  • نباید به منابع محاسباتی بزرگ نیاز داشته باشد.
  • با کوچکترین تغییر در داده های ورودی، نتیجه باید به طور قابل توجهی تغییر کند.

الگوریتم های هش محبوب چیست؟توابع هش زیر در حال حاضر در حال استفاده هستند:

  • CRC مخفف کد افزونگی چرخه ای یا چک جمع است. الگوریتم بسیار ساده است، بسته به طول خروجی مورد نیاز، تعداد زیادی تغییرات دارد. رمزنگاری نیست!
  • MD 5 یک الگوریتم بسیار محبوب است. مثل او نسخه پیشین MD 4 یک تابع رمزنگاری است. اندازه هش 128 بیت است.
  • SHA -1 همچنین یک تابع رمزنگاری بسیار محبوب است. اندازه هش 160 بیت است.
  • GOST R 34.11-94 یک استاندارد رمزنگاری روسی برای محاسبه تابع هش است. اندازه هش 256 بیت است.

چه زمانی یک مدیر سیستم می تواند از این الگوریتم ها استفاده کند؟اغلب هنگام دانلود هر محتوا، مانند برنامه‌ها از وب‌سایت سازنده، موسیقی، فیلم یا اطلاعات دیگر، یک مقدار چک‌سوم محاسبه شده با استفاده از الگوریتم خاصی وجود دارد. به دلایل امنیتی، پس از دانلود، باید به طور مستقل تابع هش را محاسبه کرده و مقدار را با آنچه در سایت یا در پیوست فایل نشان داده شده است مقایسه کنید. تا حالا این کار رو انجام دادی؟

چه چیزی برای محاسبه هش راحت تر است؟در حال حاضر تعداد زیادی از چنین ابزارهای کمکی، هم پولی و هم رایگان برای استفاده وجود دارد. من به شخصه HashTab را دوست داشتم. اولاً، در حین نصب، ابزار به عنوان یک برگه در ویژگی های فایل تعبیه شده است، ثانیاً به شما امکان می دهد تعداد زیادی الگوریتم هش را انتخاب کنید و ثالثاً برای استفاده خصوصی غیر تجاری رایگان است.

روسی چیست؟همانطور که در بالا ذکر شد، در روسیه یک استاندارد هش GOST R 34.11-94 وجود دارد که به طور گسترده توسط بسیاری از سازندگان ابزارهای امنیت اطلاعات استفاده می شود. یکی از این ابزارها برنامه تثبیت و کنترل است. حالت اولیه بسته نرم افزاری"ثابت". این برنامه ابزاری برای نظارت بر اثربخشی استفاده از امکانات امنیت اطلاعات است.

FIX (نسخه 2.0.1) برای ویندوز 9x/NT/2000/XP

  • محاسبه چک‌سوم‌های فایل‌های داده شده با استفاده از یکی از 5 الگوریتم پیاده‌سازی شده.
  • تثبیت و کنترل بعدی وضعیت اولیه بسته نرم افزاری.
  • مقایسه نسخه های بسته نرم افزاری.
  • تعمیر و کنترل دایرکتوری ها
  • کنترل تغییرات در فایل های مشخص شده (دایرکتوری ها).
  • تولید گزارش در فرمت های TXT، HTML، SV.
  • این محصول دارای گواهی FSTEC طبق NDV 3 شماره 913 تا تاریخ 01 ژوئن 2013 می باشد.

و ECP چطور؟نتیجه محاسبه تابع هش، همراه با کلید مخفی کاربر، وارد ورودی الگوریتم رمزنگاری می شود، جایی که امضای دیجیتال محاسبه می شود. به طور دقیق، تابع هش بخشی از الگوریتم EDS نیست، اما اغلب این کار به صورت عمدی انجام می شود تا از حمله کلید عمومی حذف شود.

امروزه بسیاری از اپلیکیشن های تجارت الکترونیک به شما امکان ذخیره سازی را می دهند کلید مخفیکاربر در قسمت خصوصی توکن (ruToken، eToken) بدون امکان سنجی فنیاستخراج آن از آنجا خود توکن دارای حافظه بسیار محدودی است که بر حسب کیلوبایت اندازه گیری می شود. برای امضای سند، راهی برای انتقال سند به خود توکن وجود ندارد، اما انتقال هش سند به توکن و گرفتن EDS در خروجی بسیار آسان است.

جداول هش

جدول هش(جدول به هم ریخته، جدول با آدرس های محاسبه شده) می باشد عملیات پشتیبانی از مجموعه پویاافزودن، جستجو و حذف یک عنصر و استفاده از روش های خاص خطاب به.

تفاوت اصلی جداول با سایر مجموعه های پویا در این است محاسبه آدرس عنصربر اساس مقدار کلیدی

ایده اجرای هش این است که کار با یک آرایه بزرگ به کار با تعدادی مجموعه کوچک کاهش می یابد.

مثلا یک دفترچه یادداشت. صفحات کتاب با حروف مشخص شده است. صفحه ای که با یک حرف مشخص شده است حاوی نام خانوادگی است که با آن حرف شروع می شود. مجموعه بزرگی از نام های خانوادگی به 28 زیر مجموعه تقسیم می شود. هنگام جستجو بلافاصله کتاب روی حرف مورد نظر باز می شود و جستجو تسریع می شود.

در جدول هش برنامه نویسی- این هست ساختارداده‌هایی که جفت‌ها (کلید یا شاخص + مقدار) را ذخیره می‌کنند و با آنها سه عملیات انجام می‌شود: افزودن یک جفت جدید، جستجو و حذف یک جفت به کلید.

جستجو در جداول هشدر دو مرحله انجام شد:

اولینمرحله - محاسبه یک تابع هش که تبدیل می کند کلیدجستجو در صفحه گسترده نشانی:

دومینمرحله فرآیند حل و فصل تضادها در پردازش چنین کلیدهایی است.

اگر یک ارزش های مختلفکلیدهای جدول تابع هش تولید می کند همانآدرس ها، گفته می شود که بوجود می آید برخورد(تعارض، درگیری).

توابع هش

هدف اصلی تابع هش تطبیق انواع مختلف است کلیدهادر صورت امکان مختلفمنفی نیست کلشماره.

تابع هش موضوعات بهتر، چگونه کمتر همسانارزش ها را تولید می کند.

تابع هش باید به گونه ای انتخاب شود که ویژگی های زیر برآورده شود:

    تابع هش بر روی عناصر مجموعه تعریف می شود و می گیرد عدد صحیح غیر منفیارزش های؛

    تابع هش آسان برای محاسبه;

    تابع هش می تواند بگیرد مختلفمقادیر از حدود به همان اندازه احتمال دارد(به حداقل رساندن برخورد)؛

    بر روی بستگان مقادیر آرگومانتابع هش می گیرد غیر صمیمیارزش ها از یکدیگر

برای ایجاد یک تابع هش خوب، باید توزیع کلیدها را بدانید. اگر توزیع کلید مشخص باشد، در حالت ایده آل، توزیع چگالی کلید و مقدار هش باید یکسان باشد.

اجازه دهید پ ( کلید ) - تراکم توزیع درخواست های کلیدی. سپس، در حالت ایده آل، چگالی توزیع درخواست های ورودی جدول است g ( اچ ( کلید )) به گونه ای باشد که به طور متوسط ​​تعداد عناصر گربه. لازم بود در زنجیر دوقلو رد شود، حداقل بود.

مثال.

بگذار مجموعه ای باشد کلیدها

{0, 1, 4, 5, 6, 7, 8, 9, 15, 20, 30, 40}

و اجازه دهید جدول اجازه دهد 4 ورود.

می توانید یک تابع هش بسازید:

ساعت(کلید) = کلید % 4 .

سپس موارد زیر را دریافت می کنید آدرس هابرای ورودی ها

{0, 1, 2, 3} جداول:

ساعت(کلید)

شماره ورودی

حداکثر طول زنجیر

٪ بازدید

3 0.5+1.5 0.25+0.5 0.08+1 0.17 ≈ 2.1عنصر فهرست

مثالبا یک تابع هش متفاوت

ساعت(کلید)

شماره ورودی

٪ بازدید

به طور متوسط ​​طول خواهد کشید 4 1.5 0.25 = 1.5عنصر فهرست

اگر این یک سیستم بازیابی اطلاعات باشد، عملکرد جستجوی آن حدود 25٪ افزایش می یابد.

روش های ساخت توابع هش

هش مدولار

یک روش هش ساده، کارآمد و پرکاربرد.

اندازه جدول به عنوان انتخاب شده است سادهشماره مترو تابع هش به صورت محاسبه می شود باقی مانده از تقسیم:

ساعت(کلید) = کلید % متر

کلید- مقدار عددی عدد صحیح کلید،

متر- تعداد مقادیر هش (ورودهای جدول هش).

چنین تابعی نامیده می شود مدولارو تغییر از 0 قبل از ( متر - 1 ).

تابع هش مدولار در C++:

typedefبین المللیHashIndexType;

HashIndexTypeهش(بین المللیکلید)

{ برگشتکلید % متر; }

مثال

کلید = {1, 3, 56, 4, 32, 40, 23, 7, 41,13, 6,7}

اجازه دهید متر = 5

ساعت(کلید) = {1, 3, 1, 4, 2, 0, 3, 2, 1, 3, 1, 2}

انتخاب مهم است متربرای به دست آوردن توزیع تصادفی کلیدها، باید بگیرید سادهعدد.

روش ضربی

تابع هش:

h (کلید) =

0 < آ < 1 ثابت است

12 مد5 = 2 (باقيمانده بعد از تقسيم 12 بر 5).

5,04 mod1= 0,04 (برجسته می شودقسمت کسری)

مثال

کلید = 123456

متر = 10000

آ = 0,6180339887499 = 0,618…

ساعت(کلید) = =

روش افزایشی

استفاده شده برای خطوططول متغیر (اندازه جدول متربرابر با 256).

{ HashIndexType h = 0;

در حالی که (*خ)

h += (*str)++;

برگشتساعت;

عیب روش افزودنی این است که کلمات و آناگرام های مشابه متمایز نمی شوند، یعنی. ساعت(XY ) = ساعت(YX )

روش افزایشی، که در آن کلید یک رشته کاراکتر است. در یک تابع هش، یک رشته با جمع کردن همه کاراکترها و برگرداندن باقی مانده پس از تقسیم بر به یک عدد صحیح تبدیل می شود. متر (معمولا اندازه جدول متر = 256) abcو تاکسیاین روش را می توان کمی تغییر داد و با جمع کردن اولین و آخرین کاراکترهای رشته کلید نتیجه را بدست آورد. (لن< 2) // Если длина ключа равна 0 или 1,s = key; // возвратить keyelse s = key + key;return s % m;}В этом случае коллизии будут возникать только в строках, например, abcو amc.

تابع هش کلید را می گیرد و آدرس جدول را از روی آن محاسبه می کند (آدرس می تواند یک شاخص در آرایه ای باشد که زنجیره ها به آن متصل شده اند) یعنی مثلاً می تواند عدد 3 را از رشته "abcd" دریافت کند. "، و از رشته "efgh" می تواند عدد 7 را دریافت کند و سپس اولین ساختار زنجیره از طریق هش گرفته می شود، یا از طریق هش جستجو در طول زنجیره ادامه می یابد تا اینکه "abcd" در زنجیره ساختارها از هش پیدا شود. ، یا "efgh" در زنجیره ساختارها از هش پیدا می شود که ساختار با "abcd" پیدا شود، بقیه داده های آن گرفته شده و برگردانده شود، یا تمام آن به طور کلی (آدرس آن) برگردانده شود، به طوری که شما می تواند بقیه داده ها را از آن بگیرد و زنجیره ساختارها به دلیل بسیاری ایجاد می شود کلیدهای مختلف، آدرس یکسانی در جدول داشته باشند، به عنوان مثال، تابع هش برای "abcd" می تواند 3 و برای "zxf9" نیز می تواند 3 را برگرداند، بنابراین آنها به زنجیره ای متصل می شوند که در شاخص سوم آویزان است. آرایه ........

آرایه H خود جفت های کلید-مقدار را ذخیره می کند. الگوریتم درج عنصر سلول های آرایه H را به ترتیبی بررسی می کند تا اولین خانه آزاد پیدا شود که عنصر جدید در آن نوشته می شود.

الگوریتم جستجو سلول‌های جدول هش را به همان ترتیبی که هنگام درج کردن آن انجام می‌شود جستجو می‌کند تا زمانی که یک عنصر با کلید مورد نظر یا یک سلول آزاد (یعنی هیچ عنصری در جدول هش وجود ندارد) پیدا شود.

XOR

برای رشته های با طول متغیر استفاده می شود. روش مشابه روش افزایشی است، اما کلمات مشابه را متمایز می کند. این شامل این واقعیت است که عملیات "OR انحصاری" به طور متوالی به عناصر رشته اعمال می شود.

typedef char بدون علامت HashIndexType;

کاراکتر بدون امضا Rand8;

HashIndexType Hash(char *str)

( char بدون علامت h = 0;

در حالی که (*str) h = Rand8;

برگشتساعت; }

اینجا رند8 – جدول 256 عدد تصادفی هشت بیتی.

اندازه میز<= 65536

typedef بدون علامت کوتاه int HashIndexType;

کاراکتر بدون امضا Rand8;

HashIndexType Hash(char *str)

(HashIndexType h; char بدون علامت h1, h2;

اگر (*str == 0) 0 را برگرداند.

h1 = *str; h2 = *str + 1; str++;

در حالی که (*خ)

( h1 = Rand8؛ h2 = Rand8;

str++; )

h = ((HashIndexType)h1<< 8) | (HashIndexType)h2;

بازگشت h % HashTableSize )

جهانی هش کردن

دلالت دارد تصادفیانتخاب یک تابع هش از چند مجموعه در طول تحققبرنامه ها.

اگر در روش ضربی به عنوان استفاده شود ولیدنباله تصادفیمقادیر به جای یک عدد ثابت، یک تابع هش جهانی دریافت می کنید.

با این حال، زمان تولید اعداد تصادفی نیز خواهد بود بزرگ.

می تواند به کار رود شبه تصادفیشماره.

// مولد اعداد شبه تصادفی

typedefبین المللیHashIndexType;

HashIndexTypeهش (char*v، int m)

( int h, a = 31415, b = 27183;

برای (h = 0;*v != 0; v++، a = a*b % (m - l))

h = (a*h + *v) % m;

بازگشت (h< 0) ? (h + m) : h;