ຊອກຫາການແຂ່ງຂັນ regex ທັງໝົດແມ່ນ O(n²) ສະເໝີ. | Mewayz Blog Skip to main content
Hacker News

ຊອກຫາການແຂ່ງຂັນ regex ທັງໝົດແມ່ນ O(n²) ສະເໝີ.

ຄຳເຫັນ

2 min read Via iev.ee

Mewayz Team

Editorial Team

Hacker News

ຄ່າໃຊ້ຈ່າຍທີ່ເຊື່ອງໄວ້ຂອງການຈັບຄູ່ຮູບແບບ

ສຳ​ລັບ​ຜູ້​ພັດ​ທະ​ນາ​, ການ​ສະ​ແດງ​ອອກ​ປົກ​ກະ​ຕິ (regex​) ເປັນ​ເຄື່ອງ​ມື​ທີ່​ຂາດ​ບໍ່​ໄດ້​, ມີດ​ກອງ​ທັບ​ສະ​ວິດ​ເຊີ​ແລນ​ສໍາ​ລັບ​ການ​ວິ​ເຄາະ​, ການ​ກວດ​ສອບ​, ແລະ​ການ​ດຶງ​ຂໍ້​ມູນ​ຈາກ​ຂໍ້​ຄວາມ​. ຈາກການກວດສອບຮູບແບບອີເມວຈົນເຖິງການຂູດຂໍ້ມູນຈາກບັນທຶກ, regex ແມ່ນການແກ້ໄຂ. ຢ່າງໃດກໍຕາມ, ພາຍໃຕ້ facade ທີ່ມີປະສິດທິພາບນີ້ແມ່ນກັບດັກປະສິດທິພາບທີ່ plagued ລະບົບສໍາລັບການທົດສະວັດ: ກໍລະນີທີ່ຮ້າຍແຮງທີ່ສຸດຄວາມສັບສົນຂອງການຊອກຫາທີ່ກົງກັນໃນສະຕຣິງແມ່ນ O(n²). ຄວາມຊັບຊ້ອນເວລາສີ່ຫຼ່ຽມນີ້ໝາຍຄວາມວ່າເມື່ອສາຍປ້ອນຂໍ້ມູນຈະເລີນເຕີບໂຕເປັນເສັ້ນ, ເວລາປະມວນຜົນສາມາດເຕີບໃຫຍ່ຂຶ້ນໄດ້, ເຮັດໃຫ້ເກີດການຊ້າລົງທີ່ບໍ່ຄາດຄິດ, ການໝົດຊັບພະຍາກອນ ແລະ ປະກົດການທີ່ເອີ້ນວ່າ ReDoS (Regular Expression Denial of Service). ການ​ເຂົ້າ​ໃຈ​ຂໍ້​ຈຳ​ກັດ​ທີ່​ມີ​ມາ​ແລ້ວ​ນີ້​ເປັນ​ບາດ​ກ້າວ​ທຳ​ອິດ​ໃນ​ການ​ສ້າງ​ແອັບ​ພລິ​ເຄ​ຊັນ​ທີ່​ເຂັ້ມ​ແຂງ​ຂຶ້ນ ແລະ​ປະ​ສິດ​ທິ​ຜົນ.

ເປັນຫຍັງ Regex ຈຶ່ງຈັບຄູ່ O(n²)? ບັນຫາຂອງການຕິດຕາມຄືນ

ຮາກຂອງຄວາມສັບສົນ O(n²) ແມ່ນຢູ່ໃນກົນໄກທີ່ເຄື່ອງຈັກ regex ແບບດັ້ງເດີມໃຊ້ຫຼາຍທີ່ສຸດ: backtracking. ເມື່ອເຄື່ອງຈັກ regex, ເຊັ່ນດຽວໃນ Perl, Python, ຫຼື Java, ພະຍາຍາມຊອກຫາການຈັບຄູ່ທີ່ເປັນໄປໄດ້ທັງຫມົດ, ມັນບໍ່ພຽງແຕ່ສະແກນສາຍຫນຶ່ງຄັ້ງ. ມັນຄົ້ນຫາເສັ້ນທາງທີ່ແຕກຕ່າງກັນ. ພິຈາລະນາຮູບແບບທີ່ງ່າຍດາຍເຊັ່ນ: `(a+)+b` ທີ່ໃຊ້ກັບສະຕຣິງຂອງ "a" ສ່ວນໃຫຍ່ເຊັ່ນ "aaaaaaac". ເຄື່ອງຈັກຈັບຄູ່ "a" ທັງໝົດກັບ `a+` ທຳອິດ, ຈາກນັ້ນພະຍາຍາມຈັບຄູ່ "b" ສຸດທ້າຍ. ເມື່ອມັນລົ້ມເຫລວ, ມັນຈະຖອຍຫຼັງ - ບໍ່ກົງກັນກັບ "a" ສຸດທ້າຍແລະພະຍາຍາມຕົວກໍານົດປະລິມານ `+` ໃນກຸ່ມນອກ. ຂະບວນການນີ້ເຮັດຊ້ໍາອີກ, ບັງຄັບໃຫ້ເຄື່ອງຈັກພະຍາຍາມປະສົມປະສານທີ່ເປັນໄປໄດ້ຂອງວິທີການ "a" ສາມາດຖືກຈັດເປັນກຸ່ມ, ນໍາໄປສູ່ການລະເບີດຂອງຄວາມເປັນໄປໄດ້. ຈຳນວນເສັ້ນທາງທີ່ເຄື່ອງຈັກຕ້ອງສຳຫຼວດສາມາດເປັນສັດສ່ວນກັບສີ່ຫຼ່ຽມຂອງຄວາມຍາວສາຍ, ດັ່ງນັ້ນ O(n²).

  • Greedy Quantifiers: ຮູບແບບເຊັ່ນ: `.*` ຫຼື `.+` ໃຊ້ຂໍ້ຄວາມຫຼາຍເທົ່າທີ່ເປັນໄປໄດ້ໃນຕອນຕົ້ນ, ນໍາໄປສູ່ການຕິດຕາມທີ່ກວ້າງຂວາງເມື່ອພາກສ່ວນຕໍ່ໄປຂອງຮູບແບບບໍ່ກົງກັນ.
  • Nested Quantifiers: ການສະແດງອອກເຊັ່ນ: `(a+)+` ຫຼື `(a*a*)*` ສ້າງຈຳນວນເລກກຳລັງຂອງວິທີການແຍກສະຕຣິງປ້ອນເຂົ້າ, ເພີ່ມເວລາປະມວນຜົນຢ່າງຫຼວງຫຼາຍ.
  • ຮູບແບບທີ່ບໍ່ຊັດເຈນ: ເມື່ອສະຕຣິງສາມາດຖືກຈັບຄູ່ໄດ້ໃນຫຼາຍວິທີຊ້ອນກັນ, ເຄື່ອງຈັກຈະຕ້ອງກວດເບິ່ງແຕ່ລະຄວາມເປັນໄປໄດ້ເພື່ອຊອກຫາການຈັບຄູ່ທັງໝົດ.

ຜົນກະທົບຂອງໂລກທີ່ແທ້ຈິງ: ຫຼາຍກ່ວາພຽງແຕ່ການຊ້າລົງ

ນີ້ບໍ່ພຽງແຕ່ເປັນຄວາມກັງວົນທາງວິຊາການ. regex ທີ່ບໍ່ມີປະສິດທິພາບສາມາດສົ່ງຜົນສະທ້ອນຮ້າຍແຮງໃນສະພາບແວດລ້ອມການຜະລິດ. ການກວດສອບການກວດສອບຂໍ້ມູນທີ່ເບິ່ງຄືວ່າບໍ່ເປັນອັນຕະລາຍສາມາດກາຍເປັນຂໍ້ບົກຜ່ອງໃນເວລາທີ່ການປຸງແຕ່ງໄຟລ໌ຂະຫນາດໃຫຍ່ຫຼືການຈັດການປະລິມານທີ່ຜູ້ໃຊ້ເຂົ້າມາຫຼາຍ. ຜົນໄດ້ຮັບທີ່ເປັນອັນຕະລາຍທີ່ສຸດແມ່ນການໂຈມຕີ ReDoS, ບ່ອນທີ່ນັກສະແດງທີ່ເປັນອັນຕະລາຍສະຫນອງສາຍສະຕິງທີ່ສ້າງຂື້ນຢ່າງລະມັດລະວັງທີ່ເຮັດໃຫ້ເກີດການປະຕິບັດທີ່ຮ້າຍແຮງທີ່ສຸດໃນ regex ຂອງແອັບພລິເຄຊັນເວັບ, ເຮັດໃຫ້ເຄື່ອງແມ່ຂ່າຍທີ່ຫ້ອຍຢ່າງມີປະສິດທິພາບແລະເຮັດໃຫ້ມັນບໍ່ສາມາດໃຊ້ກັບຜູ້ໃຊ້ທີ່ຖືກຕ້ອງຕາມກົດຫມາຍ. ສໍາລັບທຸລະກິດ, ນີ້ແປໂດຍກົງກັບການຢຸດເຮັດວຽກ, ການສູນເສຍລາຍໄດ້, ແລະຊື່ສຽງເສຍຫາຍ. ເມື່ອສ້າງລະບົບທີ່ຊັບຊ້ອນ, ໂດຍສະເພາະແມ່ນການປະມວນຜົນຂໍ້ມູນທີ່ບໍ່ໜ້າເຊື່ອຖື, ການຮູ້ເຖິງບັນຫາ regex ເຫຼົ່ານີ້ເປັນສ່ວນສຳຄັນຂອງການກວດສອບຄວາມປອດໄພ ແລະ ປະສິດທິພາບ.

"ຄັ້ງໜຶ່ງພວກເຮົາໄດ້ມີການອັບເດດການຕັ້ງຄ່າເລັກນ້ອຍທີ່ນໍາສະເໜີ regex ເພື່ອວິເຄາະສາຍສະຕຣິງຕົວແທນຜູ້ໃຊ້. ພາຍໃຕ້ການໂຫຼດແບບປົກກະຕິ, ມັນດີ. ແຕ່ໃນລະຫວ່າງການຈະລາຈອນທີ່ເພີ່ມຂຶ້ນ, ມັນເຮັດໃຫ້ເກີດຄວາມລົ້ມເຫຼວທີ່ພາໃຫ້ API ຂອງພວກເຮົາຫຼຸດລົງເປັນເວລານາທີ. ຜູ້ຮ້າຍແມ່ນ O(n²) regex ທີ່ພວກເຮົາບໍ່ເຄີຍຮູ້ວ່າພວກເຮົາມີ." - ວິສະວະກອນ DevOps ອາວຸໂສ

ສ້າງລະບົບທີ່ສະຫຼາດກວ່າດ້ວຍ Mewayz

ສະ​ນັ້ນ, ພວກ​ເຮົາ​ຈະ​ກ້າວ​ໄປ​ເໜືອ​ຂໍ້​ຈຳ​ກັດ​ພື້ນ​ຖານ​ນີ້​ແນວ​ໃດ? ການແກ້ໄຂປະກອບມີການປະສົມປະສານຂອງເຄື່ອງມືທີ່ດີກວ່າແລະທາງເລືອກສະຖາປັດຕະຍະກໍາທີ່ສະຫລາດກວ່າ. ທໍາອິດ, ນັກພັດທະນາສາມາດນໍາໃຊ້ການວິເຄາະ regex ເພື່ອກໍານົດຮູບແບບທີ່ມີບັນຫາແລະຂຽນຄືນໃຫມ່ເພື່ອໃຫ້ມີປະສິດທິພາບຫຼາຍຂຶ້ນ (ເຊັ່ນ: ການນໍາໃຊ້ຕົວກໍານົດປະລິມານທີ່ຄອບຄອງຫຼືກຸ່ມປະລໍາມະນູ). ເພື່ອປະສິດທິພາບສູງສຸດ, ມີສູດການຄິດໄລ່ທາງເລືອກທີ່ຮັບປະກັນເວລາເສັ້ນຊື່, O(n), ສໍາລັບການຈັບຄູ່ຮູບແບບ, ເຖິງແມ່ນວ່າພວກມັນມີຫນ້ອຍໃນຫ້ອງສະຫມຸດມາດຕະຖານ.

ນີ້ແມ່ນບ່ອນທີ່ OS ທຸລະກິດແບບໂມດູລາເຊັ່ນ Mewayz ສະຫນອງປະໂຫຍດທີ່ສໍາຄັນ. Mewayz ອະນຸຍາດໃຫ້ທ່ານສາມາດ compartmentalize ແລະຕິດຕາມກວດກາຂະບວນການທີ່ສໍາຄັນ. ແທນທີ່ຈະມີຄໍາຮ້ອງສະຫມັກ monolithic ທີ່ regex ຊ້າດຽວສາມາດທໍາລາຍລະບົບທັງຫມົດ, ທ່ານສາມາດນໍາໃຊ້ microservice ທີ່ອຸທິດຕົນ, ໂດດດ່ຽວສໍາລັບການວິເຄາະຂໍ້ມູນແລະການກວດສອບ. ຖ້າບັນຫາການປະຕິບັດເກີດຂື້ນ, ມັນຖືກບັນຈຸແລະສາມາດແກ້ໄຂໄດ້ໂດຍບໍ່ມີຜົນກະທົບຕໍ່ການດໍາເນີນທຸລະກິດອື່ນໆ. ຍິ່ງໄປກວ່ານັ້ນ, ເຄື່ອງມືການສັງເກດການພາຍໃນແພລະຕະຟອມ 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 ແມ່ນການແກ້ໄຂ. ຢ່າງໃດກໍຕາມ, ພາຍໃຕ້ facade ທີ່ມີປະສິດທິພາບນີ້ແມ່ນກັບດັກປະສິດທິພາບທີ່ plagued ລະບົບສໍາລັບການທົດສະວັດ: ກໍລະນີທີ່ຮ້າຍແຮງທີ່ສຸດຄວາມສັບສົນຂອງການຊອກຫາທີ່ກົງກັນໃນສະຕຣິງແມ່ນ O(n²). ຄວາມສັບສົນຂອງເວລາ quadratic ນີ້ຫມາຍຄວາມວ່າຍ້ອນວ່າສາຍພັນເຂົ້າເພີ່ມຂຶ້ນເປັນເສັ້ນ, ເວລາປະມວນຜົນສາມາດເຕີບໂຕເປັນຕົວເລກ, ນໍາໄປສູ່ການຊ້າລົງທີ່ບໍ່ຄາດຄິດ, ຊັບພະຍາກອນທີ່ຫມົດໄປ, ແລະປະກົດການທີ່ເອີ້ນວ່າ ReDoS (ການປະຕິເສດການສະແດງອອກປົກກະຕິ). ການ​ເຂົ້າ​ໃຈ​ຂໍ້​ຈຳ​ກັດ​ທີ່​ມີ​ມາ​ແລ້ວ​ນີ້​ເປັນ​ບາດ​ກ້າວ​ທຳ​ອິດ​ໃນ​ການ​ສ້າງ​ແອັບ​ພລິ​ເຄ​ຊັນ​ທີ່​ເຂັ້ມ​ແຂງ​ຂຶ້ນ ແລະ​ປະ​ສິດ​ທິ​ຜົນ.

ເປັນຫຍັງ Regex ຈຶ່ງຈັບຄູ່ O(n²)? ບັນຫາຂອງການຕິດຕາມຄືນ

ຮາກຂອງຄວາມສັບສົນ O(n²) ແມ່ນຢູ່ໃນກົນໄກທີ່ເຄື່ອງຈັກ regex ແບບດັ້ງເດີມໃຊ້ຫຼາຍທີ່ສຸດ: backtracking. ເມື່ອເຄື່ອງຈັກ regex, ເຊັ່ນດຽວໃນ Perl, Python, ຫຼື Java, ພະຍາຍາມຊອກຫາການຈັບຄູ່ທີ່ເປັນໄປໄດ້ທັງຫມົດ, ມັນບໍ່ພຽງແຕ່ສະແກນສາຍຫນຶ່ງຄັ້ງ. ມັນຄົ້ນຫາເສັ້ນທາງທີ່ແຕກຕ່າງກັນ. ພິຈາລະນາຮູບແບບທີ່ງ່າຍດາຍເຊັ່ນ: `(a+)+b` ທີ່ໃຊ້ກັບສະຕຣິງຂອງ "a" ສ່ວນໃຫຍ່ເຊັ່ນ "aaaaaaac". ເຄື່ອງຈັກຈັບຄູ່ "a" ທັງໝົດກັບ `a+` ທຳອິດ, ຈາກນັ້ນພະຍາຍາມຈັບຄູ່ "b" ສຸດທ້າຍ. ເມື່ອມັນລົ້ມເຫລວ, ມັນຈະຖອຍຫຼັງ - ບໍ່ກົງກັນກັບ "a" ສຸດທ້າຍແລະພະຍາຍາມຕົວກໍານົດປະລິມານ `+` ໃນກຸ່ມນອກ. ຂະບວນການນີ້ເຮັດຊ້ໍາອີກ, ບັງຄັບໃຫ້ເຄື່ອງຈັກພະຍາຍາມປະສົມປະສານທີ່ເປັນໄປໄດ້ຂອງວິທີການ "a" ສາມາດຖືກຈັດເປັນກຸ່ມ, ນໍາໄປສູ່ການລະເບີດຂອງຄວາມເປັນໄປໄດ້. ຈຳນວນເສັ້ນທາງທີ່ເຄື່ອງຈັກຕ້ອງສຳຫຼວດສາມາດເປັນສັດສ່ວນກັບສີ່ຫຼ່ຽມຂອງຄວາມຍາວສາຍ, ດັ່ງນັ້ນ O(n²).

ຜົນກະທົບຂອງໂລກທີ່ແທ້ຈິງ: ຫຼາຍກ່ວາພຽງແຕ່ການຊ້າລົງ

ນີ້ບໍ່ພຽງແຕ່ເປັນຄວາມກັງວົນທາງວິຊາການ. regex ທີ່ບໍ່ມີປະສິດທິພາບສາມາດສົ່ງຜົນສະທ້ອນຮ້າຍແຮງໃນສະພາບແວດລ້ອມການຜະລິດ. ການກວດສອບການກວດສອບຂໍ້ມູນທີ່ເບິ່ງຄືວ່າບໍ່ເປັນອັນຕະລາຍສາມາດກາຍເປັນຂໍ້ບົກຜ່ອງໃນເວລາທີ່ການປຸງແຕ່ງໄຟລ໌ຂະຫນາດໃຫຍ່ຫຼືການຈັດການປະລິມານທີ່ຜູ້ໃຊ້ເຂົ້າມາຫຼາຍ. ຜົນໄດ້ຮັບທີ່ເປັນອັນຕະລາຍທີ່ສຸດແມ່ນການໂຈມຕີ ReDoS, ບ່ອນທີ່ນັກສະແດງທີ່ເປັນອັນຕະລາຍສະຫນອງສາຍສະຕິງທີ່ສ້າງຂື້ນຢ່າງລະມັດລະວັງທີ່ເຮັດໃຫ້ເກີດການປະຕິບັດທີ່ຮ້າຍແຮງທີ່ສຸດໃນ regex ຂອງແອັບພລິເຄຊັນເວັບ, ເຮັດໃຫ້ເຄື່ອງແມ່ຂ່າຍທີ່ຫ້ອຍຢ່າງມີປະສິດທິພາບແລະເຮັດໃຫ້ມັນບໍ່ສາມາດໃຊ້ກັບຜູ້ໃຊ້ທີ່ຖືກຕ້ອງຕາມກົດຫມາຍ. ສໍາລັບທຸລະກິດ, ນີ້ແປໂດຍກົງກັບການຢຸດເຮັດວຽກ, ການສູນເສຍລາຍໄດ້, ແລະຊື່ສຽງເສຍຫາຍ. ເມື່ອສ້າງລະບົບທີ່ຊັບຊ້ອນ, ໂດຍສະເພາະແມ່ນການປະມວນຜົນຂໍ້ມູນທີ່ບໍ່ໜ້າເຊື່ອຖື, ການຮູ້ເຖິງບັນຫາ regex ເຫຼົ່ານີ້ເປັນສ່ວນສຳຄັນຂອງການກວດສອບຄວາມປອດໄພ ແລະ ປະສິດທິພາບ.

ສ້າງລະບົບທີ່ສະຫຼາດກວ່າດ້ວຍ Mewayz

ສະ​ນັ້ນ, ພວກ​ເຮົາ​ຈະ​ກ້າວ​ໄປ​ເໜືອ​ຂໍ້​ຈຳ​ກັດ​ພື້ນ​ຖານ​ນີ້​ແນວ​ໃດ? ການແກ້ໄຂປະກອບມີການປະສົມປະສານຂອງເຄື່ອງມືທີ່ດີກວ່າແລະທາງເລືອກສະຖາປັດຕະຍະກໍາທີ່ສະຫລາດກວ່າ. ທໍາອິດ, ນັກພັດທະນາສາມາດນໍາໃຊ້ການວິເຄາະ regex ເພື່ອກໍານົດຮູບແບບທີ່ມີບັນຫາແລະຂຽນຄືນໃຫມ່ເພື່ອໃຫ້ມີປະສິດທິພາບຫຼາຍຂຶ້ນ (ເຊັ່ນ: ການນໍາໃຊ້ຕົວກໍານົດປະລິມານທີ່ຄອບຄອງຫຼືກຸ່ມປະລໍາມະນູ). ເພື່ອປະສິດທິພາບສູງສຸດ, ມີສູດການຄິດໄລ່ທາງເລືອກທີ່ຮັບປະກັນເວລາເສັ້ນຊື່, O(n), ສໍາລັບການຈັບຄູ່ຮູບແບບ, ເຖິງແມ່ນວ່າພວກມັນມີຫນ້ອຍໃນຫ້ອງສະຫມຸດມາດຕະຖານ.

ສ້າງ OS ທຸລະກິດຂອງທ່ານໃນມື້ນີ້

ຈາກ​ນັກ​ງານ​ອິດ​ສະ​ລະ​ເຖິງ​ອົງ​ການ, Mewayz ມອບ​ອຳ​ນາດ​ໃຫ້ 138,000+ ທຸ​ລະ​ກິດ​ດ້ວຍ 208 ໂມ​ດູນ​ປະ​ສົມ​ປະ​ສານ. ເລີ່ມຟຣີ, ອັບເກຣດເມື່ອທ່ານເຕີບໃຫຍ່.

ສ້າງບັນຊີຟຣີ →