تدوین الگوهای

ساخت وبلاگ

API کامپایلر Hyperscan عبارات منظم را می پذیرد و آنها را به یک پایگاه داده الگوی گردآوری تبدیل می کند که می تواند برای اسکن داده ها استفاده شود.

API سه عملکرد را ارائه می دهد که عبارات منظم را در پایگاه داده ها کامپایل می کنند:

  1. HS_COMPILE (): یک عبارت واحد را در یک پایگاه داده الگوی گردآوری می کند.
  2. hs_compile_multi (): مجموعه ای از عبارات را در یک پایگاه داده الگوی گردآوری می کند. تمام الگوهای عرضه شده برای زمان اسکن به طور همزمان اسکن می شوند و شناسه های تهیه شده توسط کاربر هنگام مطابقت با آنها باز می گردند.
  3. HS_COMPILE_EXT_MULTI (): مجموعه ای از عبارات را مانند بالا کامپایل می کند ، اما اجازه می دهد تا پارامترهای گسترده برای هر عبارت مشخص شود.

تدوین به كتابخانه Hyperscan اجازه می دهد تا الگوی (های) داده شده را تجزیه و تحلیل كند و از قبل تعیین كند كه چگونه می توان این الگوها را به صورت بهینه اسكن كرد كه برای محاسبه در زمان اجرا بسیار گران باشد.

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

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

برای تهیه الگوهای مورد استفاده در حالت جریان ، پارامتر حالت HS_COMPILE () باید روی HS_MODE_STREAM تنظیم شود. به طور مشابه ، حالت بلوک نیاز به استفاده از HS_MODE_BLOCK دارد و حالت بردار نیاز به استفاده از HS_MODE_VECTORED دارد. یک پایگاه داده الگوی گردآوری شده برای یک حالت (جریان ، بلوک یا بردار) فقط در آن حالت قابل استفاده است. نسخه Hyperscan که برای تولید یک پایگاه داده الگوی کامپایل شده استفاده می شود ، باید با نسخه Hyperscan که برای اسکن با آن استفاده می شود مطابقت داشته باشد.

Hyperscan پشتیبانی را برای هدف قرار دادن یک پایگاه داده در یک بستر CPU خاص فراهم می کند. برای جزئیات بیشتر به تخصص مجموعه دستورالعمل مراجعه کنید.

کامپایل لفظهای خالص

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

به عنوان مثال ، با توجه به عبارتی نوشته شده به عنوان / bc؟ /. می توانیم بگوییم که این یک بیان منظم است ، با این معنی که شخصیت B و به دنبال آن هیچ چیز یا یک شخصیت c. از نظر دیگر ، ما همچنین می توانیم بگوییم که این یک بیان تحت اللفظی خالص است ، با این معنی که این یک توالی کاراکتر از طول 3 بایت است ، حاوی کاراکترهای B ، C و؟بشربه طور منظم ، شخصیت علامت سوال؟دارای نقش نحوی خاصی به نام 0-1 Quantifier است که با شخصیت پیش روی آن ارتباط نحوی دارد. شخصیت های مشابه در گرامر منظم مانند [،] ، (،) ، وجود دارند.<,>، - ، * ، + ، ، |، / ،: ، ^ ،.، $در حالی که در مورد تحت اللفظی خالص ، تمام این شخصیت های متا معانی اضافی را از دست داده اند که انتظار دارند که آنها فقط کدهای ASCII رایج باشند.

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

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

در v5. 2. 0 ، Hyperscan 2 API کامپایل جدید را برای الگوهای تحت اللفظی خالص معرفی می کند:

  1. HS_COMPILE_LIT (): یک لفظی خالص را در یک پایگاه داده الگوی کامپایل می کند.
  2. HS_COMPILE_LIT_MULTI (): مجموعه ای از لفظات خالص را در یک پایگاه داده الگوی گردآوری می کند. تمام الگوهای عرضه شده برای زمان اسکن به طور همزمان اسکن می شوند و شناسه های تهیه شده توسط کاربر هنگام مطابقت با آنها باز می گردند.

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

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

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

اگر مجموعه قانون هدف حداقل یک عبارت معمولی دارد ، لطفاً از API های کامپایل سنتی HS_COMPILE () ، HS_COMPILE_MULTI () و HS_COMPILE_EXT_MULTI () استفاده کنید. API های تحت اللفظی جدید که در اینجا معرفی شده اند برای مجموعه های قانون که فقط عبارات تحت اللفظی خالص دارند ، طراحی شده اند.

پشتیبانی از الگوی

Hyperscan از الگوی استفاده شده توسط کتابخانه PCRE ("libpcre") که در آن شرح داده شده است ، پشتیبانی می کند. با این حال ، همه سازه های موجود در libpCre پشتیبانی نمی شوند. استفاده از سازه های پشتیبانی نشده منجر به خطاهای تلفیقی خواهد شد.

نسخه PCRE برای اعتبارسنجی تفسیر Hyperscan از این نحو 8. 41 یا بالاتر است.

سازه های پشتیبانی شده

سازه های REGEX زیر توسط Hyperscan پشتیبانی می شوند:

  • شخصیت ها و رشته های تحت اللفظی ، با همه نقل قول های Libpcre و فرار شخصیت.
  • کلاس های شخصیت مانند.(dot) ، [abc] ، و [^abc] ، و همچنین کلاس های شخصیت از پیش تعریف شده s ، d ، w ، v و h و همتایان نفی آنها ( s ، d ، w ، v ، و h).
  • کلاسهای شخصیت Posix نامگذاری شده است [[:xxx:]] و کلاسهای شخصیت نامگذاری شده را نفی کرد [[:^xxx:]] .
  • خصوصیات شخصیت یونیکد ، مانند p ، p ، p.
  • اندازه گیری ها:
    • کمی از مواردی مانند؟، * و + هنگام استفاده از زیر بیان خودسرانه پشتیبانی می شوند.
    • مقدمات تکراری محدود مانند ، با محدودیت ها پشتیبانی می شوند.
      • برای الگوی های مکرر خودسرانه: N و M باید کوچک یا نامتناهی باشند ، به عنوان مثال(a | b) ، (ab؟ c؟ d) یا (ab (cd)*).
      • برای الگوهای زیر عرض یک کاراکتر مانند [^ a] یا. یا x ، تقریباً همه تعداد تکرار پشتیبانی می شوند ، به جز مواردی که تکرارها بسیار بزرگ هستند (حداکثر محدودتر از 32767). حالت های جریان ممکن است برای تکرارهای بزرگ محدود ، به عنوان مثال بسیار بزرگ باشد. A. B. توجه: اگر در ابتدا یا انتهای الگوها و به خصوص اگر پرچم HS_FLAG_SINGLEMATCH برای آن الگوی روشن باشد ، چنین الگوهای فرعی ممکن است به طور قابل توجهی ارزان تر باشند.
      • من: مطابق با HS_FLAG_CASLESS ، تطبیق حساس.
      • M: مطابق با hs_flag_multiline.
      • S: تفسیر کنید. به عنوان "هر کاراکتر" ، طبق HS_FLAG_DOTALL.
      • X: نحو گسترده ، که بیشتر فضای سفید را در الگوی سازگاری با گزینه pcre_extended libpcre نادیده می گیرد.

      به عنوان مثال ، BAR (؟ i) BAR (؟-i) BAZ تطبیق حساس به مورد را فقط برای قسمت نوار مسابقه روشن می کند.

      اندازه گیری های تکرار شده محدود با تعداد مکرر بزرگ عبارات دلخواه (به عنوان مثال ([[A-Z] | BC*D | XY؟ z)) منجر به خطای "الگوی خیلی بزرگ" در زمان کامپایل الگوی خواهد شد.

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

      سازه های پشتیبانی نشده

      سازه های REGEX زیر توسط Hyperscan پشتیبانی نمی شوند:

      • BackReferences و گرفتن زیر بیان.
      • ادعاهای عرض صفر دلخواه.
      • منابع فرعی و الگوهای بازگشتی.
      • الگوهای مشروط.
      • افعال کنترل پشتی.
      • دستورالعمل C "تک بایت" (که توالی UTF-8 را می شکند).
      • مسابقه r Newline.
      • شروع تنظیم مجدد مسابقه.
      • فراخوان و کد تعبیه شده.
      • گروه بندی اتمی و اندازه گیری های قدرتمند.

      مفاهیم¶

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

      عزیمتهای اصلی از معناشناسی libpcre عبارتند از:

      1. تطبیق الگوی چندگانه: Hyperscan اجازه می دهد تا مسابقات برای چندین الگوی به طور همزمان گزارش شود. این معادل جدا کردن الگوهای توسط |در libpcre ، که گزینه های چپ به راست را ارزیابی می کند.
      2. فقدان سفارش: چندین مسابقه که Hyperscan تولید می کند تضمین نمی شود که سفارش داده شود ، اگرچه همیشه در محدوده اسکن فعلی قرار می گیرند.
      3. فقط جبران خاتمه: رفتار پیش فرض Hyperscan فقط گزارش جبران پایان یک مسابقه است. گزارش جبران شروع با پرچم های هر بیان در زمان کامپایل الگوی قابل فعال کردن است. برای جزئیات بیشتر به شروع مسابقه مراجعه کنید.
      4. "همه مسابقات" گزارش داد: Scaing /foo. mbar/ در برابر Fooxyzbarbar دو مسابقه را از Hyperscan برمی گرداند - در نقاط مربوط به انتهای Fooxyzbar و Fooxyzbarbar. در مقابل ، معناشناسی libpcre به طور پیش فرض فقط یک مسابقه را در Fooxyzbarbar (معانی حریص) گزارش می دهد یا اگر معانی غیر سبز روشن شود ، یک مسابقه در Fooxyzbar. این بدان معناست که جابجایی بین معانی حریص و غیر سبز ، عدم وجود در Hyperscan است.

      برای پشتیبانی از معانی کمیته LibpCre در حالی که گزارش دقیق مسابقات جریان در زمان وقوع آنها غیرممکن است. به عنوان مثال ، الگوی بالا ، /foo. mbar/ را در حالت جریان ، در برابر جریان زیر (سه بلوک اسکن شده به ترتیب) در نظر بگیرید:

      بلوک 1

      بلوک 2

      بلوک 3

      فوکیزبر

      قارچ

      qbar

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

      در این مثال ، مسابقه در Offset 9 در بلوک اول فقط مسابقه صحیح (تحت معانی LibPCRE) است اگر هیچ نوار در یک بلوک بعدی وجود نداشته باشد - مانند بلوک 3 - که این یک مسابقه بهتر برای این الگوی است.

      شروع مسابقه

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

      استفاده از پرچم SOM مستلزم تعدادی از تجارت و محدودیت ها است:

      • پشتیبانی از الگوی کاهش یافته: برای بسیاری از الگوهای ، ردیابی SOM پیچیده است و می تواند منجر به عدم موفقیت در یک الگوی با خطای "الگوی خیلی بزرگ" شود ، حتی اگر این الگوی در عملکرد عادی پشتیبانی شود.
      • افزایش وضعیت جریان: در زمان اسکن ، فضای دولتی برای ردیابی جبران خسارات احتمالی SOM لازم است و این باید در حالت جریان مداوم در حالت جریان ذخیره شود. بر این اساس ، SOM به طور کلی حالت جریان مورد نیاز برای مطابقت با یک الگوی را افزایش می دهد.
      • سربار عملکرد: به طور مشابه ، به طور کلی هزینه عملکرد مرتبط با ردیابی SOM وجود دارد.
      • ویژگی های ناسازگار: برخی دیگر از پرچم های الگوی Hyperscan (مانند HS_FLAG_SINGLEMATCH و HS_FLAG_PREFILTER) را نمی توان در ترکیب با SOM استفاده کرد. مشخص کردن آنها به همراه HS_FLAG_SOM_LEFTST به خطای تلفیقی منجر می شود.

      در حالت جریان ، میزان دقت تحویل داده شده توسط SOM با پرچم های SOM Horizon قابل کنترل است. اینها به Hyperscan دستور می دهند تا اطلاعات دقیق SOM را در فاصله مشخصی از انتهای انتهای ارائه دهند و یک جبران ویژه ویژه HS_OFFSET_PAST_HORIZON را برگردانند. مشخص کردن یک افق سام کوچک یا متوسط معمولاً حالت جریان مورد نیاز برای یک پایگاه داده معین را کاهش می دهد.

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

      پارامترهای گسترده

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

      پارامترهای گسترده با استفاده از یک ساختار HS_EXPR_EXT_T مشخص شده است ، که زمینه های زیر را ارائه می دهد:

      • پرچم ها: پرچم های حاکم بر کدام یک از زمینه های دیگر در ساختار استفاده می شود.
      • min_offset: حداقل جبران پایان در جریان داده ای که در آن این عبارت باید با موفقیت مطابقت داشته باشد.
      • max_offset: حداکثر جبران پایان در جریان داده ای که در آن این عبارت باید با موفقیت مطابقت داشته باشد.
      • min_l طول: حداقل طول مسابقه (از ابتدا تا انتها) لازم است تا با موفقیت با این عبارت مطابقت داشته باشد.
      • edit_distance: این عبارت را در فاصله Levenshtein مشخص کنید.
      • HAMMING_DISTANCE: این عبارت را در فاصله چکش زدن مشخص کنید.

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

      به عنوان مثال ، الگوی / foo. mbar/ هنگامی که یک min_offset 10 و max_offset از 15 داده می شود ، در صورت اسکن در برابر Foobar یا FOO0123456789BAR ، مسابقه ای ایجاد نمی کند اما در برابر جریان داده های FOO0123BAR یا FOO0123456BAR ایجاد می کند.

      به طور مشابه ، الگوی / foobar / هنگامی که به ویرایش_دیت 2 داده می شود ، در هنگام اسکن در برابر Foobar ، F00bar ، Fooba ، FOBR ، FO_BAZ ، FOOOOBAR و هر چیز دیگری که در فاصله ویرایش 2 قرار دارد (همانطور که با فاصله Levenshtein تعریف شده است) ایجاد می شود.

      هنگامی که به همان الگوی / foobar / یک hamming_distance 2 داده می شود ، در هنگام اسکن در برابر Foobar ، Boofar ، F00bar و هر چیز دیگری با بیشترین دو شخصیت جایگزین الگوی اصلی می شود. برای اطلاعات بیشتر ، به بخش تقریبی تطبیق مراجعه کنید.

      حالت مقدماتی

      Hyperscan یک پرچم در هر الگوی ، HS_FLAG_PREFILTER را فراهم می کند ، که می تواند برای اجرای پیش نمایش برای یک الگوی استفاده شود تا اینکه Hyperscan معمولاً از آن پشتیبانی نمی کند.

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

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

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

      به عنوان مثال ، الگوی / ( w+) دوباره 1 / حاوی برگه برگشت 1 است. در حالت مقدماتی ، این الگوی ممکن است با استفاده از مرجع پشتی خود با مرجع خود ، تقریب شود ، دوباره / w+ دوباره w+ /.

      علاوه بر این ، در حالت پیش نویس ، hyperscan ممکن است الگویی را ساده کند که در غیر این صورت خطای "الگوی خیلی بزرگ" را در زمان کامپایل یا به دلایل عملکرد بازگرداند (با توجه به ضمانت تطبیق بالا).

      به طور کلی انتظار می رود که برنامه متعاقباً مسابقات مقدماتی را با یک تطابق معمولی بیان کننده دیگری تأیید کند که می تواند مسابقات دقیقی را برای این الگوی فراهم کند.

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

      مجموعه دستورالعمل تخصصی

      Hyperscan قادر به استفاده از چندین ویژگی مجموعه دستورالعمل مدرن است که در پردازنده های x86 یافت می شود تا پیشرفت هایی در عملکرد اسکن ارائه دهد.

      برخی از این ویژگی ها هنگام ساخت کتابخانه انتخاب می شوند. به عنوان مثال ، Hyperscan از دستورالعمل های بومی POPCNT در پردازنده هایی که در دسترس است استفاده می کند و کتابخانه برای معماری میزبان بهینه شده است.

      به طور پیش فرض ، زمان اجرا Hyperscan با پرچم کامپایل ر-march = بومی ساخته شده است و (در صورت امکان) از کلیه دستورالعمل های شناخته شده توسط کامپایلر C میزبان استفاده می کند.

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

      توابع API کامپایلر Hyperscan همه یک آرگومان اختیاری HS_PLATFORM_INFO_T را می پذیرند ، که پلت فرم هدف را برای ساخت پایگاه داده توصیف می کند. اگر این آرگومان تهی باشد ، پایگاه داده در بستر میزبان فعلی هدف قرار می گیرد.

      ساختار HS_PLATFORM_INFO_T دو قسمت دارد:

      1. TUNE: این به برنامه اجازه می دهد تا اطلاعات مربوط به بستر هدف را که ممکن است برای هدایت فرایند بهینه سازی کامپایل استفاده شود ، مشخص کند. استفاده از این قسمت پردازنده هایی را که پایگاه داده حاصل می تواند بر روی آن اجرا شود ، محدود نمی کند ، اما ممکن است بر عملکرد پایگاه داده حاصل تأثیر بگذارد.
      2. CPU_FEATURES: این به برنامه اجازه می دهد تا ماسک ویژگی های CPU را که ممکن است در بستر هدف استفاده شود ، مشخص کند. به عنوان مثال ، HS_CPU_FEATURES_AVX2 را می توان برای پشتیبانی از وکتور Advanced Vector 2 (Intel® AVX2) پشتیبانی تنظیم کرد. اگر پرچمی برای یک ویژگی CPU خاص مشخص شود ، پایگاه داده بدون آن ویژگی در CPU قابل استفاده نخواهد بود.

      یک ساختار HS_PLATFORM_INFO_T که در میزبان فعلی هدف قرار گرفته است می تواند با عملکرد HS_POPULATION_PLATFORM () ساخته شود.

      به API مرجع مراجعه کنید: ثابت برای لیست کامل تنظیم CPU و پرچم های ویژگی.

      تطبیق تقریبی

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

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

      در اینجا چند نمونه از تطبیق تقریبی آورده شده است:

      • الگوی / FOO / می تواند با استفاده از رفتار منظم تطبیق Hyperscan مطابقت داشته باشد. با تطبیق تقریبی در ویرایش فاصله 2 ، این الگوی در هنگام اسکن در برابر FOO ، FOOOO ، F00 ، F و هر چیز دیگری که در فاصله ویرایش 2 از شرکت تطبیق شرکت برای الگوی اصلی قرار دارد (FOO در این مورد) است.
      • الگوی / foo (نوار)+ / با فاصله ویرایش 1 با فوباربار ، foobarb0r ، fooarbar ، foobarba ، f0obarbar ، fobarbar و هر چیز دیگری که در فاصله ویرایش 1 از تطبیق شرکت ها برای الگوی اصلی (فوباربار در این مورد) مطابقت دارد.
      • الگوی / foob؟ ar / با ویرایش فاصله 2 با fooar ، foo ، fabar ، OAR و هر چیز دیگری که در فاصله ویرایش 2 از تطبیق شرکت برای الگوی اصلی قرار دارد مطابقت دارد (fooar در این مورد).

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

      • پشتیبانی از الگوی کاهش یافته:
        • برای بسیاری از الگوهای ، تطبیق تقریبی پیچیده است و می تواند منجر به عدم موفقیت در تدوین الگوی با خطای "الگوی خیلی بزرگ" شود ، حتی اگر این الگوی در عملکرد عادی پشتیبانی شود.
        • علاوه بر این ، برخی از الگوهای تقریباً نمی توانند مطابقت داشته باشند زیرا به الگوهای به اصطلاح "خالی" کاهش می یابد (الگوهای مطابق با همه چیز). به عنوان مثال ، الگوی / FOO / با ویرایش فاصله 3 ، در صورت اجرای ، به بافرهای با طول صفر کاهش می یابد. چنین الگوهای منجر به خطای کامپایل "الگوی تقریباً مطابق با الگوی نمی شوند. تطبیق تقریبی در فاصله چکش زدن نمادها را از بین نمی برد ، بنابراین به یک الگوی خالی کاهش نمی یابد.
        • سرانجام ، به دلیل پیچیدگی های ذاتی تعریف رفتار تطبیق ، تطبیق تقریبی یک زیر مجموعه کاهش یافته از نحو بیان منظم را پیاده سازی می کند. تطبیق تقریبی از UTF-8 (و سایر رمزگذاری شخصیت های چند بیت) و مرزهای کلمه (یعنی b ، b و سایر سازه های معادل) پشتیبانی نمی کند. الگوهای حاوی سازه های پشتیبانی نشده منجر به خطای کامپایل "الگوی تقریباً نمی شوند".
        • هنگام استفاده از تطابق تقریبی در رابطه با SOM ، تمام محدودیت های SOM نیز اعمال می شود. برای اطلاعات بیشتر به شروع مسابقه مراجعه کنید.

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

        ترکیبات منطقی ¶

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

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

        به عنوان مثال ، 101 به این معنی نیست که بیان 101 هنوز در این افست مطابقت ندارد.

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

        برای نشان دادن ، در اینجا یک عبارت ترکیبی نمونه وجود دارد:

        ((301 OR 302) وت 303) وت (304 OR نه 305) 

        اگر بیان 301 در افست 10 مطابقت داشته باشد ، مقدار منطقی 301 صحیح است در حالی که مقادیر الگوهای دیگر نادرست است. از این رو ، ارزش کل ترکیب نادرست است.

        سپس بیان 303 در افست 20. اکنون مقادیر 301 و 303 صحیح است در حالی که مقادیر الگوهای دیگر هنوز نادرست هستند. در این حالت ، مقدار ترکیب صحیح است ، بنابراین بیان ترکیبی مسابقه را در افست 20 افزایش می دهد.

        سرانجام ، بیان 305 دارای مسابقات در افست 30 است. اکنون مقادیر 301 ، 303 و 305 صادق است در حالی که مقادیر دیگر الگوهای هنوز نادرست هستند. در این حالت ، مقدار این ترکیب نادرست است و هیچ مسابقه ای مطرح نمی شود.

        با استفاده از ترکیبات منطقی

        در نحو ترکیب منطقی ، یک عبارت به عنوان نماد Infix نوشته شده است ، از عملیات ، اپراتورها و پرانتز تشکیل شده است. اپراند ها شناسه های بیان هستند و اپراتورها هستند!(نه) ، & (و) یا |(یا). به عنوان مثال ، ترکیبی که در بخش قبلی شرح داده شده است به این صورت نوشته می شود:

        ((301 | 302) & 303) & (304 |! 305)

        در یک عبارت ترکیبی منطقی:

        • The priority of operators are !> &>|بشرمثلا:
          • a & b | c به عنوان (a & b) | c ، رفتار می شود
          • A | B& C به عنوان A | (B& C) رفتار می شود ،
          • a &! b به عنوان a & (! b) رفتار می شود.
          • (الف) &! (ب) همان A &! b است ،
          • (a & b) | c همان A& B | c است.

          برای استفاده از یک عبارت ترکیبی منطقی ، باید به یکی از توابع کامپایل Hyperscan (HS_COMPILE_MULTI () ، HS_COMPILE_EXT_MULTI ()) به همراه پرچم HS_FLAG_COMBINATION منتقل شود ، که این الگوی را به عنوان یک عبارت ترکیبی منطقی مشخص می کند. الگوهای ذکر شده در بیان ترکیبی منطقی باید در همان الگوی تنظیم شده به عنوان عبارت ترکیبی جمع شوند.

          هنگامی که یک عبارت دارای پرچم HS_FLAG_COMBINATION است ، تمام پرچم های دیگر را به جز پرچم HS_FLAG_SINGLEMATCH و پرچم HS_FLAG_QUIET نادیده می گیرد.

          Hyperscan عبارات ترکیبی منطقی را در زمان کامپایل می پذیرد که در صورت مطابقت با الگوی ، به درست ارزیابی می شود و اگر هیچ الگویی با هم مطابقت نداشته باشد ، مسابقه را برای ترکیب در پایان داده ها گزارش می دهد. مثلا:

          ! 101! 101 | 102! 101 &! 102! (101 و 102)

          الگویی که از آنها به عنوان عملیات در یک ترکیب منطقی (به عنوان مثال ، 301 تا 305 در مثالهای بالا) گفته می شود نیز ممکن است از پرچم HS_FLAG_QUIET برای ساکت گزارش های مربوط به مسابقات فردی برای آن الگوهای استفاده کنند. در صورت عدم وجود این پرچم ، تمام مسابقات (هم برای الگوهای فردی و هم برای ترکیب منطقی آنها) گزارش می شود.

          هنگامی که یک عبارت دارای پرچم HS_FLAG_COMBINATION و مجموعه پرچم HS_FLAG_QUIET است ، هیچ تطبیقی برای این ترکیب منطقی گزارش نمی شود.

          فهرست مطالب

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

برچسب : نویسنده : احمد نجفی بازدید : <-PostHit-> تاريخ : يکشنبه 1 مرداد 1402 ساعت: 11:16