Бүх регекс тохирохыг олох нь үргэлж O(n²) байсан. | Mewayz Blog Skip to main content
Hacker News

Бүх регекс тохирохыг олох нь үргэлж O(n²) байсан.

Сэтгэгдэл

1 min read Via iev.ee

Mewayz Team

Editorial Team

Hacker News

Загвар тааруулах далд зардал

Хөгжүүлэгчдийн хувьд ердийн илэрхийлэл (regex) нь текстээс мэдээллийг задлан шинжлэх, баталгаажуулах, задлах Швейцарийн армийн зайлшгүй хэрэгсэл юм. Имэйлийн форматыг шалгахаас эхлээд бүртгэлээс өгөгдлийг хусах хүртэл regex нь хамгийн тохиромжтой шийдэл юм. Гэсэн хэдий ч энэхүү хүчирхэг фасадны доор олон арван жилийн турш системүүдийг зовоож байсан гүйцэтгэлийн урхи оршдог: мөрөнд байгаа бүх тохирохыг олоход хамгийн хэцүү цаг хугацаа нь O(n²) юм. Энэхүү квадрат цагийн нарийн төвөгтэй байдал нь оролтын мөр шугаман өсөхийн хэрээр боловсруулалтын хугацаа экспоненциалаар нэмэгдэж, гэнэтийн удаашрал, нөөц шавхагдаж, ReDoS (Regular Expression Deial of Service) гэж нэрлэгддэг үзэгдэлд хүргэдэг гэсэн үг юм. Энэхүү төрөлхийн хязгаарлалтыг ойлгох нь илүү бат бөх, үр ашигтай хэрэглээг бий болгох эхний алхам юм.

Яагаад Regex Matching O(n²) гэж? Буцах тухай асуудал

O(n²) нарийн төвөгтэй байдлын үндэс нь ихэнх уламжлалт регекс хөдөлгүүрүүдийн ашигладаг механизмд оршдог: ухрах. Perl, Python эсвэл Java-д байдаг шиг regex хөдөлгүүр нь бүх боломжит тохирохыг олохыг оролдох үед энэ нь мөрийг нэг удаа скан хийхгүй. Энэ нь янз бүрийн замыг судалдаг. "aaaaaaaaac" гэх мэт ихэвчлэн "a"s-ийн мөрөнд хэрэглэсэн `(a+)+b` гэх мэт энгийн загварыг авч үзье. Хөдөлгүүр нь бүх "a"-г эхний `a+`-тай тааруулж, дараа нь эцсийн "b"-тэй таарахыг оролддог. Амжилтгүй болсон үед энэ нь буцдаг—сүүлийн "a"-тай таарахгүй, гадна талын бүлэгт `+` хэмжигчийг оролдоно. Энэ үйл явц давтагдаж, хөдөлгүүрийг "а"-г хэрхэн бүлэглэж болох бүх боломжит хослолыг туршиж үзэхийг албаддаг бөгөөд энэ нь боломжуудын хослолын тэсрэлтэд хүргэдэг. Хөдөлгүүрийн судлах ёстой замын тоо нь мөрний уртын квадраттай пропорциональ байж болох тул O(n²).

  • Шунамхай тоологч: `.*` эсвэл `.+` гэх мэт загварууд нь эхэндээ аль болох их текст хэрэглэдэг бөгөөд дараачийн хэсгүүд нь таарахгүй байх үед их хэмжээний ухралт хийхэд хүргэдэг.
  • Үүрлэсэн тоологч: `(a+)+` эсвэл `(a*a*)*` гэх мэт илэрхийллүүд нь оролтын мөрийг хуваах экспоненциал тооны аргыг бий болгож, боловсруулах хугацааг эрс нэмэгдүүлдэг.
  • Тодорхой утгагүй загвар: Мөрийг хэд хэдэн давхцалтайгаар тааруулж болох үед хөдөлгүүр бүх тохирохыг олохын тулд боломж бүрийг шалгах ёстой.

Бодит ертөнцөд үзүүлэх нөлөө: удаашралаас ч илүү

Энэ бол зөвхөн эрдэм шинжилгээний асуудал биш. Үр ашиггүй regex нь үйлдвэрлэлийн орчинд ноцтой үр дагаварт хүргэж болзошгүй. Өгөгдлийн баталгаажуулалтын шалгалт нь асар их хэмжээний файл боловсруулах эсвэл хэрэглэгчийн их хэмжээний оролтыг боловсруулахад саад учруулж болзошгүй юм. Хамгийн аюултай үр дагавар нь ReDoS халдлага бөгөөд хорлонтой этгээд нь вэб програмын regex-ын хамгийн муу гүйцэтгэлийг өдөөж, серверийг үр дүнтэй өлгөж, хууль ёсны хэрэглэгчдэд ашиглах боломжгүй болгодог болгоомжтой боловсруулсан мөрийг өгдөг. Бизнесийн хувьд энэ нь шууд зогсолт, орлого алдагдах, нэр хүндээ алддаг гэсэн үг юм. Нарийн төвөгтэй системүүдийг, ялангуяа итгэмжгүй өгөгдлийг боловсруулдаг системийг бий болгохдоо эдгээр regex алдааг мэдэж байх нь аюулгүй байдал, гүйцэтгэлийн аудитын чухал хэсэг юм.

"Бид нэгэн удаа хэрэглэгчийн агентийн мөрүүдийг задлан шинжилдэг регексийг нэвтрүүлсэн бага зэргийн тохиргооны шинэчлэлт хийсэн. Ердийн ачаалалтай үед энэ нь зүгээр байсан. Гэвч замын хөдөлгөөний огцом өсөлтийн үед энэ нь шаталсан бүтэлгүйтэлд хүргэж, бидний API-г хэдэн минутын турш устгасан. Гэм буруутан нь бидний хэзээ ч мэдэхгүй O(n²) регекс байсан." - DevOps-ийн ахлах инженер

Mewayz-тэй илүү ухаалаг системийг бий болгох нь

Тэгвэл бид энэ үндсэн хязгаарлалтаас хэрхэн гарах вэ? Энэхүү шийдэл нь илүү сайн багаж хэрэгсэл, илүү ухаалаг архитектурын сонголтуудын хослолыг агуулдаг. Нэгдүгээрт, хөгжүүлэгчид регекс анализаторуудыг ашиглан асуудалтай хэв маягийг тодорхойлж, илүү үр дүнтэй болгохын тулд тэдгээрийг дахин бичиж болно (жишээ нь, эзэмшлийн хэмжигдэхүүн эсвэл атомын бүлгүүдийг ашиглах). Тохиромжтой гүйцэтгэлийн хувьд загварт тааруулах шугаман цаг O(n)-ийг баталгаажуулдаг өөр алгоритмууд байдаг ч стандарт номын санд тийм ч түгээмэл биш байдаг.

Энэ бол Mewayz шиг модульчлагдсан бизнесийн үйлдлийн систем нь чухал давуу талыг өгдөг. Mewayz нь чухал үйл явцыг хэсэгчлэн, хянах боломжийг танд олгоно. Ганц удаашралтай регекс нь бүхэл системийг саатуулж болох цул програмтай байхын оронд та өгөгдлийг задлан шинжлэх, баталгаажуулах зориулалттай, тусгаарлагдсан микросервисийг ашиглаж болно. Гүйцэтгэлийн асуудал гарвал түүнийг багтаасан бөгөөд бусад бизнесийн үйл ажиллагаанд нөлөөлөхгүйгээр шийдвэрлэх боломжтой. Цаашилбал, Mewayz платформ дахь ажиглалтын хэрэгслүүд нь таны үйлчлүүлэгчдэд нөлөөлөхөөс өмнө эдгээр үр ашиггүй байдлыг тодорхойлж, болзошгүй хямралыг удирдах боломжтой оновчлолын ажил болгон хувиргахад тусална. Уян хатан, ажиглагдахуйц суурь дээр тулгуурлан та нарийн төвөгтэй текст боловсруулалт зэрэг бизнесийн логик нь гүйцэтгэлтэй, уян хатан хэвээр байх болно.

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →

Байнга асуудаг асуултууд

Загвар тааруулах далд зардал

Хөгжүүлэгчдийн хувьд ердийн илэрхийлэл (regex) нь текстээс мэдээллийг задлан шинжлэх, баталгаажуулах, задлах Швейцарийн армийн зайлшгүй хэрэгсэл юм. Имэйлийн форматыг шалгахаас эхлээд бүртгэлээс өгөгдлийг хусах хүртэл regex нь хамгийн тохиромжтой шийдэл юм. Гэсэн хэдий ч энэхүү хүчирхэг фасадны доор олон арван жилийн турш системүүдийг зовоож байсан гүйцэтгэлийн урхи оршдог: мөрөнд байгаа бүх тохирохыг олоход хамгийн хэцүү цаг хугацаа нь O(n²) юм. Энэхүү квадрат цагийн нарийн төвөгтэй байдал нь оролтын мөр шугаман өсөхийн хэрээр боловсруулалтын хугацаа экспоненциалаар нэмэгдэж, гэнэтийн удаашрал, нөөц шавхагдаж, ReDoS (Regular Expression Denial of Service) гэгддэг үзэгдэлд хүргэдэг гэсэн үг юм. Энэхүү төрөлхийн хязгаарлалтыг ойлгох нь илүү бат бөх, үр ашигтай хэрэглээг бий болгох эхний алхам юм.

Яагаад Regex Matching O(n²) гэж? Буцах тухай асуудал

O(n²) нарийн төвөгтэй байдлын үндэс нь ихэнх уламжлалт регекс хөдөлгүүрүүдийн ашигладаг механизмд оршдог: ухрах. Perl, Python эсвэл Java-д байдаг шиг regex хөдөлгүүр нь бүх боломжит тохирохыг олохыг оролдох үед энэ нь мөрийг нэг удаа скан хийхгүй. Энэ нь янз бүрийн замыг судалдаг. "aaaaaaaaac" гэх мэт ихэвчлэн "a"s-ийн мөрөнд хэрэглэсэн `(a+)+b` гэх мэт энгийн загварыг авч үзье. Хөдөлгүүр нь бүх "a"-г эхний `a+`-тай тааруулж, дараа нь эцсийн "b"-тэй таарахыг оролддог. Амжилтгүй болсон үед энэ нь буцдаг—сүүлийн "a"-тай таарахгүй, гадна талын бүлэгт `+` хэмжигчийг оролдоно. Энэ үйл явц давтагдаж, хөдөлгүүрийг "а"-г хэрхэн бүлэглэж болох бүх боломжит хослолыг туршиж үзэхийг албаддаг бөгөөд энэ нь боломжуудын хослолын тэсрэлтэд хүргэдэг. Хөдөлгүүрийн судлах ёстой замын тоо нь мөрний уртын квадраттай пропорциональ байж болох тул O(n²).

Бодит ертөнцөд үзүүлэх нөлөө: удаашралаас ч илүү

Энэ бол зөвхөн эрдэм шинжилгээний асуудал биш. Үр ашиггүй regex нь үйлдвэрлэлийн орчинд ноцтой үр дагаварт хүргэж болзошгүй. Өгөгдлийн баталгаажуулалтын шалгалт нь асар их хэмжээний файл боловсруулах эсвэл хэрэглэгчийн их хэмжээний оролтыг боловсруулахад саад учруулж болзошгүй юм. Хамгийн аюултай үр дагавар нь ReDoS халдлага бөгөөд хорлонтой этгээд нь вэб програмын regex-ын хамгийн муу гүйцэтгэлийг өдөөж, серверийг үр дүнтэй өлгөж, хууль ёсны хэрэглэгчдэд ашиглах боломжгүй болгодог болгоомжтой боловсруулсан мөрийг өгдөг. Бизнесийн хувьд энэ нь шууд зогсолт, орлого алдагдах, нэр хүндээ алддаг гэсэн үг юм. Нарийн төвөгтэй системүүдийг, ялангуяа итгэмжгүй өгөгдлийг боловсруулдаг системийг бий болгохдоо эдгээр regex алдааг мэдэж байх нь аюулгүй байдал, гүйцэтгэлийн аудитын чухал хэсэг юм.

Mewayz-тэй илүү ухаалаг системийг бий болгох

Тэгвэл бид энэ үндсэн хязгаарлалтаас хэрхэн гарах вэ? Энэхүү шийдэл нь илүү сайн багаж хэрэгсэл, илүү ухаалаг архитектурын сонголтуудын хослолыг агуулдаг. Нэгдүгээрт, хөгжүүлэгчид регекс анализаторуудыг ашиглан асуудалтай хэв маягийг тодорхойлж, илүү үр дүнтэй болгохын тулд тэдгээрийг дахин бичиж болно (жишээ нь, эзэмшлийн хэмжигдэхүүн эсвэл атомын бүлгүүдийг ашиглах). Тохиромжтой гүйцэтгэлийн хувьд загварт тааруулах шугаман цаг O(n)-ийг баталгаажуулдаг өөр алгоритмууд байдаг ч стандарт номын санд тийм ч түгээмэл биш байдаг.

Өнөөдөр бизнесийн үйлдлийн системээ байгуулаарай

Чөлөөт ажилчдаас эхлээд агентлаг хүртэл Mewayz нь 208 нэгдсэн модулиудаар 138,000 гаруй бизнес эрхэлдэг. Үнэгүй эхлүүлээрэй, өсөх үедээ шинэчилнэ үү.

Үнэгүй бүртгэл үүсгэх→