ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : docbook>STL_Iterator
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
HTML º¯È¯¹®¼
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
<article lang="ko">
<!-- -->
<!-- ¹®¼ Á¤º¸ -->
<!-- -->
<articleinfo>
<title>Iterator</title>
<author>
<surname>À± »ó¹è</surname>
<affiliation>
<address>
<email>dreamyun@yahoo.co.kr</email>
</address>
</affiliation>
</author>
</articleinfo>
<!-- -->
<!-- ¼½¼Ç ½ÃÀÛ -->
<!-- -->
<!-- Âü°í »çÀÌÆ® : -->
<!-- http://www.cs.brown.edu/people/jak/proglang/cpp/stltut/tut.html -->
<section>
<title>¼Ò°³</title>
<para>
À̹ø±Û¿¡´Â STL ¿¡ ´ëÇÑ °£´ÜÇÑ ÀÀ¿ëÀ» Æ÷ÇÔÇÑ´Ù.
´ë·®ÀÇ µ¥ÀÌŸ¸¦ Ãë±ÞÇØ¾ß ÇÒ¶§ ¾î¶»°Ô ÀÛ¾÷À» ÇØ¾ß ÇÒ·±Áö¿¡
´ëÇÑ ¸î°¡Áö ¹®Á¦µéÀ» ´ã°í ÀÖ´Ù.
</para>
<para>
À̸¦ À§Çؼ DOS ATTACK °ø°ÝÀ» °ËÃâÇÏ´Â ¾îÇø®ÄÉÀ̼ÇÀ» ¿¹·Î µé¾î¼
¼³¸íÀ» ÇÒ°ÍÀÌ´Ù. ±×·¯³ª ÀÌ ¹®¼´Â ¾îµð±îÁö³ª ¹æ¹ýÀ» Á¦½ÃÇÏ´Â ¹®¼·Î½á
¿Ïº®ÇÑ Äڵ带 Á¦½ÃÇÏÁø ¾ÊÀ»°ÍÀ̸ç, Å×½ºÆ® °¡´ÉÇÑ ¼öÁØÀÇ Äڵ常À» Á¦°øÇÒ°ÍÀ̸ç
±¸Çö¿¡ ´ëÇÑ °í¹ÎÀº °¢ÀÚÀÇ ¸òÀÌ µÉ°ÍÀÌ´Ù.
</para>
<para>
DOS °ø°Ý¿¡ ´ëÇÑ ³»¿ëÀº <ulink url=http://www.joinc.co.kr/modules.php?name=News&file=article&sid=109&mode=nested>³×Æ®¿÷ º¸¾ÈÀÇ ±âº»(1)</ulink>À» Âü°íÇϱ⠹ٶõ´Ù.
</para>
</section>
<section>
<title>DOS ATTACK °ËÃâ ¾îÇø®ÄÉÀÌ¼Ç Á¦ÀÛ</title>
<para>
°£´ÜÇÑ DOS °ø°ÝÀ» °Ë»öÇÏ´Â ¾îÇø®ÄÉÀ̼ÇÀ» ¸¸µç´Ù°í
°¡Á¤À» ÇØº¸ÀÚ. DOS °ø°ÝÀÇ °æ¿ì º¸Åë ÇϳªÀÇ IP¿¡¼ ƯÁ¤ Æ÷Æ®·Î
ªÀº½Ã°£¿¡ ¿äûÀÌ µé¾î¿Ã°ÍÀÓÀ¸·Î, "5ÃÊ¿¡ 20¹øÀÇ ¿äûÀÌ ÀÖÀ¸¸é
DOS °ø°ÝÀ¸·Î °£ÁÖÇÑ´Ù" ¶ó´Â ½ÄÀ¸·Î DOS °ø°Ý¿¡ ´ëÇØ¼
Á¤Àǰ¡ °¡´ÉÇÏ´Ù.
</para>
<para>
±×·¸´Ù¸é ¾îÇø®ÄÉÀ̼ÇÀº ÇØ´çÆÐŶÀÌ µé¾î¿Ã°æ¿ì IP Á¤º¸¸¦
ºÐ¼®Çؼ Ä«¿îÆÃÇϰí, ÀÌ Ä«¿îÆÃÀÌ 5ÃÊ ³»¿¡ 20¹ø ¹ß»ý
Çß´Ù¸é "DOS WARN ¸Þ½ÃÁö"¸¦ ½ÃÄÑ¾ß ÇÒ°ÍÀÌ´Ù.
</para>
<para>
ÀÌ ¾îÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇϴµ¥ ÀÖ¾î¼ °¡Àå Áß¿äÇÑ Æ÷ÀÎÆ®´Â
ÀڷᱸÁ¶ÀÇ À¯Áö¿Í È¿À²¼ºÀÌ µÉ°ÍÀÌ´Ù.
DOS ¾îÅÃÀ» ÆÇ´ÜÇÏ´Â ±Ù°Å´Â IP¿Í PORT °¡ µÊÀ¸·Î, ¸ðµç ÀÔ·Â
IP¿Í PORT¿¡ ´ëÇÑ Å×À̺íÀ» À¯ÁöÇϰí ÀÖ¾î¾ß ÇÑ´Ù.
</para>
<para>
±×·±µ¥ ¾Æ½Ã´Ù ½ÃÇÇ IPÀÇ ¹üÀ§´Â ³Ê¹« ³Ð´Ù. Á» ³Î¸® ¾Ë·ÁÁø ¹Ù»Û¼¹ö
¶ó¸é ªÀº½Ã°£¿¡ ¼öõ-¼ö¸¸ ȤÀº ±×ÀÌ»óÀÇ ¼·Î´Ù¸¥ IP ¿¡¼ÀÇ
Á¢±ÙÀÌ ÀÌ·ç¾îÁú¼ö ÀÖÀ»°Å´Ù. ¸¸¾à ¶ó¿ìÅÍ¿¡ ¼³Ä¡ÇÒ°æ¿ì
´õ¿í ¸¹Àº Á¢±ÙÀÌ ÀϾ°ÍÀÌ´Ù.
ÀÌ°É ´Ü¼øÈ÷ map À̳ª vector ·Î IPÁ¤º¸ Å×À̺íÀ» ±¸¼ºÇÒ°æ¿ì
È¿À²¿¡ ¹®Á¦°¡ ¹ß»ýÇÒ¼ö ÀÖ´Ù.
</para>
<section>
<title>È¿À²ÀûÀÎ ÀڷᱸÁ¶¸¦ »ý°¢Çغ¸ÀÚ</title>
<para>
±×·³ ¾î¶»°Ô ÇØ¾ß È¿À²ÀûÀÎ ÀڷᱸÁ¶¸¦ ¸¸µé¼ö ÀÖÀ»±î..
´Ü¼øÇÑ map À¸·Î ÇÒ°æ¿ì ¸¸¾à IP°¡ ¼ö¸¸°³°¡ µé¾î¿Â´Ù¸é,
¼ö¸¸°³ÀÇ ¿ø¼Ò·Î ÀÌ·ç¾îÁø °Å´ëÇÑ map µ¥ÀÌŸ°¡ ¸¸µé¾îÁú
°ÍÀ̸ç, ´õ Ä¿Áú¼öµµ ÀÖÀ»°ÍÀÌ´Ù. °Å±â¿¡ port Á¤º¸±îÁö
Æ÷ÇÔÇØ¾ß µÊÀ¸·Î, ´Ü¼ø map À¸·Î ±¸¼ºÇϱ⿡´Â
¿ø¼ÒÀÇ °¹¼ö°¡ ³Ê¹« ¸¹¾ÆÁø´Ù.
</para>
<para>
map Àº Á¤·Ä¿¬°ü ÄÁÅ×À̳ʷΠ±ÕÇü ÀÌÁøÆ®¸® ±¸Á¶¸¦ °¡Áø´Ù.
´ÙÀ½Àº map ÀÇ º¹Àâµµ(Complexity guarantees) ÀÌ´Ù.
size() ´Â map ¿¡ Æ÷ÇÔµÈ ¿ø¼ÒÀÇ °¹¼öÀ̸ç, count(k) ´Â
»èÁ¦ÇϰíÀÚ ÇÏ´Â key ÀÇ °¹¼öÀÌ´Ù. N Àº ¿ø¼ÒÀÇ °¹¼öÀÌ´Ù.
<table>
<title>Æò±Õ º¹Àâµµ(Average complexity)</title>
<tgroup cols=2>
<tbody>
<row>
<entry>erase key</entry>
<entry>O(log(size()) + count(k))</entry>
</row>
<row>
<entry>erase element</entry>
<entry>constant time</entry>
</row>
<row>
<entry>¹üÀ§ »èÁ¦</entry>
<entry>O(log(size()) + N)</entry>
</row>
<row>
<entry>count</entry>
<entry>O(log(size()) + count(k))</entry>
</row>
<row>
<entry>find</entry>
<entry>logarithmic</entry>
</row>
</tbody>
</tgroup>
</table>
¿¹¸¦ µé¾î 13¸¸°³ Á¤µµÀÇ ¿ø¼Ò¸¦ °¡Áø map ¿¡¼ ƯÁ¤ÇÑ
¿ø¼Ò¸¦ ãÀ»°æ¿ì Æò±Õ °É¸®´Â ½Ã°£Àº ¾à 17 Á¤µµ°¡ µÉ°ÍÀÌ´Ù.
1,000,000 Àº ¾à 20 ÀÌ´Ù.
</para>
<para>
DOS °ø°ÝÀ» °Ë»öÇØ³»´Â ¾îÇø®ÄÉÀ̼ÇÀ̶ó¸é ¶ó¿ìÅÍ¿¡ ¼³Ä¡µÉ°Íµµ
»ý°¢ÇغÁ¾ß ÇÑ´Ù. ±×·¡¼ Æò±Õ 1,000,000 ÀÇ µ¥ÀÌŸ¿¡¼
¼ÃëÇÏ´Â°É·Î ÇØ¼ °è»êÇØº¸¸é ´ë·® 20 Á¤µµÀÇ ½Ã°£ÀÌ ¼Ò¸ðµÈ´Ù.
20 Àº ÀÌó·³ ¹Ù»Û¾îÇø®ÄÉÀÌ¼Ç ²Ï³ª Å«¼öÄ¡ÀÌ´Ù.
±×·³À¸·Î ½Ã°£À» Á»´õ ÁÙ¿©¾ß ÇÒ Çʿ伺ÀÌ ÀÖ´Ù.
</para>
<para>
°Ô´Ù°¡ ÀÌ ¾îÇø®ÄÉÀ̼ÇÀ» À§Çؼ map À» ±¸¼ºÇÑ´Ù°í ÇßÀ»¶§
map ÀÇ key ´Â IP¿Í PORT ÀÇ Á¶ÇÕÀÌ µÉ°ÍÀÓÀ¸·Î, ¹é¸¸ ÀÌ»óÀÇ
µ¥ÀÌŸ¸¦ °¨´çÇÒ¼ö ÀÖ´Ù°í ºÁ¾ßÇÒ°ÍÀÌ´Ù.
</para>
<section>
<title>ÇØ½¬¸¦ ÀÌ¿ëÇÑ È¿À²¼º ³ôÀ̱â</title>
<para>
±×·¡¼ »ý°¢ÇÒ¼ö ÀÖ´Â°Ô Hash ÇÔ¼öÀÇ »ç¿ëÀÌ´Ù.
Hash ÇÔ¼ö´Â µ¥ÀÌŸ Ãà¾àÀ» À§ÇÑ ÇÔ¼ö·Î½á, °°Àº °ªÀ»
ÀÔ·ÂÇßÀ»¶§´Â ¾ðÁ¦³ª °°Àº µ¥ÀÌŸ Ãà¾àÀ» ¾ò¾î³¾¼ö ÀÖ´Â
ÇÔ¼öÀÌ´Ù.
</para>
<para>
¿ì¸®°¡ Ãà¾àÇØ¾ßÇÒ µ¥ÀÌŸ´Â ¹°·Ð 32bit Å©±âÀÇ IP ÁÖ¼Ò
ÀÌ´Ù. 32bit ´Â ¹üÀ§°¡ ³Ê¹«³ª ³ÐÀ½À¸·Î À̰ÍÀ» 1024(2^10)
Á¤µµ·Î ÁÙÀ̵µ·Ï ÇϰڴÙ. HASH ÇÔ¼ö´Â ¸Å¿ì ´Ü¼ø¹«½ÄÇÑ
¹æ¹ýÀ¸·Î IP ÁÖ¼Ò 32bit Áß 10bit ¸¸À» ÀÌ¿ëÇØ¼ Hash
°ªÀ» ¾òµµ·ÏÇϴµ¥, ´ÜÁö ½¬ÇÁÆ® ¿¬»êÀ» ÇØÁÖ´Â °Í¸¸À¸·Î
ÇØ°á°¡´ÉÇÏ´Ù.
<screen>
int hash(ulong ip)
{
return ip >> 22;
}
</screen>
ÀÌ °ªµéÀº 0 ºÎÅÍ 1023 ±îÁö ºÐÆ÷°¡ µÉ°ÍÀÓÀ¸·Î
vector ȤÀº array ·Î ÀڷᱸÁ¶¸¦ ±¸ÇöÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.
IP °¡ µé¾î¿À¸é 0 - 1023 Áß¿¡ ÇϳªÀÇ °ªÀ¸·Î hashing µÉ°Çµ¥,
vector ¿¡ Áý¾î³ÖÀ»¶§´Â ÀÌ hashing µÈ °ªÀÚü¸¦ ÷ÀÚ·Î ÇØ¼
ÀÔ·ÂÇÒ¼ö ÀÖÀ½À¸·Î ½Ã°£º¹Àâµµ´Â O(1) ÀÌ µÉ°ÍÀÌ´Ù.
´Ù¸¥ ¸»·Î "ÇÑŰ" ¿¡ ÀÚ½ÅÀÌ ÀúÀåµÉ °÷À» ã¾Æ°¥¼ö
ÀÖ°Ô µÈ´Ù. ÀÌ vector ´Â ۸¦ IP¿Í PORT·Î °¡Áö´Â map À»
¿ø¼Ò·Î °¡Áö°Ô µÉ°ÍÀÌ´Ù.
</para>
<para>
°¡Àå ÀÌ»óÀûÀÎ »óȲÀº IP°¡ 2^20 °³°¡
µé¾îÀִµ¥ 0¿¡¼ 1023±îÁöÀÇ vector ¿¡ ¾ÆÁÖ ±ÕµîÇϰÔ
µé¾îÀÖ´Â »óȲÀ¸·Î °¢ vector ÀÇ ¿ø¼Ò´Â 1024 °³ÀÇ ¿ø¼Ò¸¦
°¡Áö´Â map À» °¡Áö°Ô µÉ°ÍÀÌ´Ù. ÀÌ»óȲ¿¡¼ ¿øÇÏ´Â
µ¥ÀÌŸ (IP,PORT¸¦ Ű·Î °¡Áö´Â)¸¦ ã´Âµ¥ °É¸®´Â ½Ã°£Àº
"vector ¿¡¼ ÷ÀÚ¿¬»êÇϴµ¥ °É¸®´Â ½Ã°£ O(1)" + "O(log1024)"
°¡ µÉ°ÍÀÌ´Ù. ±×·³À¸·Î ´ë·« 11 ¹øÁ¤µµ¿¡ ¿øÇÏ´Â °ªÀ»
ãÀ»¼ö ÀÖ°Ô µÈ´Ù. ÃÖÃÊ map ¸¸À» »ç¿ëÇßÀ»¶§ÀÇ 20 ¿¡
ºñÇÏ¸é °ÅÀÇ Àý¹Ý¼öÁØÀ¸·Î ÁÙ¾îµêÀ» ¾Ë¼ö ÀÖ´Ù.
</para>
<para>
¹°·Ð À§ÀÇ »óȲÀº ¸Å¿ì ÀÌ»óÀûÀÎ »óȲÀ̸ç, ½ÇÁ¦·Î´Â
À§ÀÇ °æ¿ì¿¡ ºñÇØ¼ ´õ ¸¹Àº ½Ã°£ÀÌ ¼Ò¸ðµÉ°ÍÀÌ´Ù.
¿Ö³ÄÇϸé À§ÀÇ ´Ü¼øÇÑ ÇØ½¬ÇÔ¼ö·Î´Â IP°¡ ±ÕµîÇÏ°Ô 0-1023 À¸·Î
ºÐÆ÷µÇ±â°¡ Èûµé°ÍÀ̱⠶§¹®ÀÌ´Ù.
ÇØ½¬ÇÔ¼ö¸¦ ¸¸µå´Âµ¥ ÀÖ¾î¼ °¡Àå Áß¿äÇÑ ºÎºÐÀº ¹Ù·Î
ÀԷµ¥ÀÌŸµé¿¡ ´ëÇØ¼ ÃÖ´ëÇÑ ±ÕµîÇÏ°Ô ºÐÆ÷µÇ´Â ÇØ½¬°ªÀ»
¾ò¾î³»´Â °ÍÀε¥, À§ÀÇ ÇÔ¼ö·Î´Â ºÐ¸íÈ÷ ±ÕµîÇÏ°Ô ºÐÆ÷µÇÁö
¾ÊÀ»°ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÏ´ÜÀº À§ÀÇ ÇØ½¬ÇÔ¼ö¸¦ »ç¿ëÇϵµ·Ï ÇϰڴÙ.
Á»´õ ¼º´ÉÁÁÀº ÇØ½¬ÇÔ¼ö´Â ¸¹Àº °í¹Î°ú Å×½ºÆ®¸¦ ÅëÇØ¼ ¸¸µé¾î
Áú¼ö ÀÖÀ»°ÍÀÌ´Ù.(°ø°³µÈ°Íµéµµ ¸¹ÀÌ ÀÖÀ¸´Ï google µîÀ» ÅëÇØ¼
È®ÀÎÇØº¸±â ¹Ù¶õ´Ù)
</para>
</section>
<section>
<title>ÃÖÁ¾ÀûÀÎ ÀڷᱸÁ¶</title>
<para>
´ÙÀ½Àº ÀÌ·¸°Ô ÇØ¼ ¸¸µé¾îÁø ÃÖÁ¾ÀûÀÎ ÀڷᱸÁ¶ÀÌ´Ù.
<figure>
<title>map ÀڷᱸÁ¶</title>
<graphic fileref=http://www.joinc.co.kr/albums/album01/abf.gif>
</figure>
hash °ªÀ» À§ÇÑ 1024 Å©±âÀÇ vector °¡ ³õÀδÙ. ÀÌ vector Àº
IP,PORT ¸¦ key ·Î °¡Áö°í, TIME, COUNT ¸¦ value·Î °¡Áö´Â map À» ¿ø¼Ò·Î
°¡Áø´Ù. TIME Àº ÆÐŶÀÌ µé¾î¿Â ½Ã°£À̸ç, COUNT ´Â ¸î¹ø µé¾î¿Ô´ÂÁö¸¦ °è¼öÇϱâ
À§Çؼ »ç¿ëµÈ´Ù.
ÀÌ map ÀÇ ÀڷᱸÁ¶´Â ´ëÃæ ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.
<screen>
typedef struct _key
{
int ip;
int port;
} key;
typedef struct _value
{
int time;
int count;
} value;
struct ltstr
{
bool operator() (key a1, key a2)
{
return memcmp((void *)&a1, (void *)&a2, 8) < 0;
}
};
map<key, value, ltstr> mydata;
</screen>
ltstr À» ÁÖ¸ñÇϱ⠹ٶõ´Ù. ltstr Àº key ¸¦ Á¤·ÄÇϱâ À§Çؼ Á¤ÀǵǾú´Âµ¥,
memcmp ¸¦ ÀÌ¿ëÇØ¼ 2°³ÀÇ ±¸Á¶Ã¼ÀÇ Å©±â¸¦ ºñ±³ÇÑ´Ù. 2°³ÀÇ int ¸¦ °¡Áö°í
ÀÖÀ½À¸·Î 8byte Å©±â·Î ºñ±³ÇÏ¸é µÉ°ÍÀÌ´Ù.
´ÙÀ½Àº Å×½ºÆ®¸¦ À§ÇÑ °£´ÜÇÑ ÄÚµåÀÌ´Ù.
</para>
<para>
<emphasis>¿¹Á¦ : map_test.cc</emphasis>
<screen>
#include <vector>
#include <map>
#include <iostream>
using namespace std;
// map ÀÇ KEY °ªÀ¸·Î ip¿Í port Á¤º¸¸¦ °¡Áø´Ù.
typedef struct _key
{
ulong ip;
int port;
} key;
// map ÀÇ VALUE °ªÀ¸·Î óÀ½ ¸¸µé¾îÁø ½Ã°£°ú
// Ä«¿îÆ® °¹¼öÀÌ´Ù.
typedef struct _value
{
int time;
int count;
} value;
// KEY ÀÎ struct key ¸¦ Á¤·ÄÇϱâ À§Çؼ »ç¿ëÇÑ´Ù.
// memcmp ¸¦ ÀÌ¿ëÇØ¼ Á¤·ÄÇϵµ·Ï ÇÑ´Ù.
struct ltstr
{
bool operator() (key a1, key a2)
{
return memcmp((void *)&a1, (void *)&a2, 8) < 0;
}
};
int main()
{
key mkey;
value mvalue;
map<key, value, ltstr> mydata;
mkey.ip = 134;
mkey.port = 4;
mydata[mkey] = mvalue;
mkey.ip = 134;
mkey.port = 3;
mydata[mkey] = mvalue;
mkey.ip = 132;
mkey.port = 1;
mydata[mkey] = mvalue;
map<key,value,ltstr>::iterator mi;
mi = mydata.begin();
while(mi != mydata.end())
{
cout << mi->first.ip << ","<< mi->first.port << endl;
*mi++;
}
}
</screen>
Á¤·Ä¼ø¼´Â ¸ÕÀú ip¸¦ ¿ì¼±À¸·Î ÇÑ´Ù. ¸¸¾à ip °¡ µ¿ÀÏÇÒ°æ¿ì port ¹øÈ£·Î
Á¤·ÄÀÌ µÉ°ÍÀÌ´Ù. ¾ÆÁ÷Àº ¸¸µé¾îÁø map Á¤º¸¸¦ hash Å×ÀÌºí¿¡ ÀÔ·ÂÇÏÁö ¾Ê¾Ò´Âµ¥,
<xref linkend="skelcode">¿¡¼ ¼³¸íÇÒ°ÍÀÌ´Ù.
</para>
</section>
<section id="skelcode">
<title>skeleton code (°ñ°Ý ÄÚµå)</title>
<para>
ÀÌÁ¦ ½ÇÁ¦ÀûÀÎ °ñ°Ý Äڵ带 ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ.
ÀÌ°Ç ¾îµð±îÁö³ª Áö±Ý±îÁö ¿ì¸®°¡ »ý°¢Çß´ø ÀڷᱸÁ¶°¡ ½ÇÁ¦
±¸ÇöµÉ¼ö ÀÖ´ÂÁö¸¦ È®ÀÎÇØ º¸´Â Å×½ºÆ®¼öÁØÀÇ ÄÚµåÀÌ´Ù.
</para>
<para>
ÀÌ ¾îÇø®ÄÉÀ̼ÇÀº IP¿Í Port ¹øÈ£ ¸¦ ÀÌ¿ëÇØ¼ Key ¸¦ ¸¸µé°í
¸¸¾à µ¿ÀÏÇÑ IP, Port ¿¡¼ ¿¬°áÀÌ µé¾î¿Ô´Ù¸é, count ¸¦ 1¾¿ Áõ°¡½ÃŲ´Ù.
¸¸¾à ÁöÁ¤µÈ ½Ã°£(À§À¸ Äڵ忡¼´Â 30ÃÊ) µ¿¾È 100 ¹øÀÌ»óÀÇ count °¡
¹ß»ýÇÒ°æ¿ì Dos °ø°ÝÀ̶ó°í ÆÇ´ÜÇÏ°í ¿ö´× ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù.
<screen>
#include <vector>
#include <map>
#include <time.h>
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
using namespace std;
typedef struct _key
{
ulong ip;
int port;
} key;
typedef struct _value
{
int time;
int count;
} value;
struct ltstr
{
bool operator() (key a1, key a2)
{
return memcmp((void *)&a1, (void *)&a2, 8) < 0;
}
};
int hash(ulong ip)
{
return ip >> 22;
}
map<key, value, ltstr> mydata;
vector<map<key, value, ltstr> > hash_map(1024);
void InitValue(value *mvalue);
int insert_packet(key akey);
int main()
{
key mkey;
value mvalue;
// Å×½ºÆ®¿ë ÀÚ·á ÀÔ·Â ----------------
mkey.ip = inet_addr("192.168.100.1");
mkey.port = 21 ;
insert_packet(mkey);
mkey.ip = inet_addr("192.168.100.1");
mkey.port = 2;
insert_packet(mkey);
mkey.ip = inet_addr("192.168.100.3");
mkey.port = 22;
insert_packet(mkey);
mkey.ip = inet_addr("192.168.100.200");
mkey.port = 80;
insert_packet(mkey);
mkey.ip = inet_addr("192.168.100.1");
mkey.port = 2;
insert_packet(mkey);
// Å×½ºÆ®¿ë ÀÚ·á ÀÔ·Â ----------------
// Å×½ºÆ®¸¦ À§Çؼ Ãâ·ÂÇÑ´Ù.
// 192.168.100.1 ¿¡ ´ëÇÑ hash ۸¦ ¸¸µé°í
// °ªÀ» Ãâ·ÂÇØº»´Ù.
mkey.ip = inet_addr("192.168.100.1");
mkey.port = 2;
map<key, value, ltstr>::iterator mi;
cout << hash(mkey.ip) << endl;
mi = hash_map[hash(mkey.ip)].find(mkey);
if (mi == hash_map[hash(mkey.ip)].end())
{
cout << "not found " << endl;
}
else
{
cout << mi->second.time << ":" << mi->second.count << endl;
}
}
// key ¸¦ ÀԷ¹޾Ƽ
// hash ۸¦ ¸¸µé¾î¼ ÇØ´ç hash_map ÀڷᱸÁ¶¿¡ ÀÔ·ÂÇÑ´Ù.
int insert_packet(key akey)
{
value mvalue;
int hash_value = hash(akey.ip);
map<key,value,ltstr>::iterator mi;
mi = hash_map[hash_value].find(akey);
InitValue(&mvalue);
// ¸¸¾à ÀÌ¹Ì Á¸ÀçÇϰí ÀÖ´Ù¸é
// count ¸¦ Áõ°¡ ½ÃŲ´Ù.
if (mi != hash_map[hash_value].end())
{
cout << "Count Áõ°¡" << endl;
mi->second.count++;
}
// ±×·¸Áö ¾Ê´Ù¸é »õ·Î »ý¼ºÇÑ´Ù.
else
{
cout << "Insert " << endl;
hash_map[hash_value].insert(pair<key, value>(akey, mvalue));
}
}
void InitValue(value *mvalue)
{
mvalue->time = time((time_t *)NULL);
mvalue->count = 1;
}
</screen>
</para>
</section>
</section>
<section>
<title>¹®Á¦ ¹ß»ý(È¿À² ¹®Á¦)</title>
<para>
ºñ·Ï °ñ°Ý ÄÚµåÀ̱ä ÇÏÁö¸¸ À§ÀÇ Äڵ尡 ºñ±³Àû È¿À²ÀûÀ¸·Î
ÀÛµ¿Çϸ®¶õ°É ¿¹»óÇÒ¼ö ÀÖ´Ù.
±×·¯³ª ÀÌ°Ç ¾îµð±îÁö³ª µ¥ÀÌŸ ÀÔ·ÂÀÇ °æ¿ìÀÌ´Ù.
</para>
<para>
À§ÀÇ ¹æ½ÄÀ¸·Î ÇØ¼ µ¥ÀÌŸ°¡ °è¼Ó ½×ÀÌ´Â °Ç ±×·¸´Ù Ä¡°í,
Àú·± »óÅ·Π¸î½Ã°£¸¸ µ¹¸é ºÐ¸íÈ÷ map ¿¡´Â ¼ö½Ê/¼ö¹é¸¸°ÇÀÇ
µ¥ÀÌŸ°¡ ½×ÀÌ°Ô µÉ°ÍÀÌ´Ù. ±âº»ÀûÀ¸·Î Ä«¿îÅͰ¡ ÀÏÁ¤¼ö¸¦
³Ñ¾î°¡¾ß¸¸ Áö¿öÁö±â ¶§¹®¿¡ Ä«¿îÅͰ¡ ÃʰúÇßÀ»°æ¿ì
ÀڷᱸÁ¶¿¡¼ Áö¿öÁø´Ù°í ÇÏ´õ¶óµµ, ±×·¸Áö ¾ÊÀº ¼ö¸¹Àº
µ¥ÀÌŸ´Â Áö¿öÁöÁö ¾ÊÀ»°ÍÀ̱⠶§¹®ÀÌ´Ù.
°á±¹ ¸î½Ã°£µµ ¾ÈµÇ¾î¼
¸ðµç ½Ã½ºÅÛ ¸Þ¸ð¸® ÀÚ¿øÀ» ¸ù¶¥ ½á¹ö¸®°Ô µÉ°ÍÀÌ´Ù.
</para>
<para>
ÀÌ·¯ÇÑ ¹®Á¦ÀÇ ÇØ°áÀ» À§Çؼ value ¿¡ time À̶ó´Â º¯¼ö¸¦
µÎ±ä ÇßÀ½À¸·Î, ÀÏÁ¤½Ã°£ ¸¶´Ù time ¸¦ È®ÀÎÇϰí,
ÃʰúµÈ ¸Þ½ÃÁö´Â Áö¿öÁÜÀ¸·Î½á ÇØ°áÀÌ °¡´ÉÇÒ °ÍÀÌ´Ù.
</para>
<para>
±×·¸´Ù¸é ¾î¶»°Ô Áö¿öÁÙ°ÍÀΰ¡.. ´Ü¼øÇѹæ¹ýÀº vector ÀÇ 0¹øºÎÅÍ
1023¹ø±îÁöÀÇ ¸ðµç map À» ¼øÈ¯ÇÏ¸é¼ ÀÏÀÏÀÌ time ºñ±³¸¦ ÇØ¼
time ÀÌ ÃʰúÇßÀ»°æ¿ì Áö¿öÁÖ´Â ¹æ¹ýÀε¥,
ô ºÁµµ ¾Ë°ÚÁö¸¸, ³Ê¹«³Ê¹« ºñÈ¿À²ÀûÀÌ´Ù. µ¥ÀÌŸ°¡ ½Ê¸¸
ȤÀº ¹é¸¸ Á¤µµ µé¾îÀÖ´Ù°í °¡Á¤ÇØ º¸ÀÚ. Á¦´ë·Î ÀÛµ¿Çϴ°É
±â´ëÇϱâ Èûµé°ÍÀÌ´Ù.
</para>
<section>
<title>ÇØ°á - ÀÌÅÍ·¹ÀÌÅÍ ÀúÀåÇϱâ</title>
<para>
ÀÌ·²°æ¿ì »ý°¢ÇÒ¼ö ÀÖ´Â ¹æ¹ýÀÌ garbage µ¥ÀÌŸ Á¤¸®¸¦ À§ÇÑ
º°µµÀÇ ÀڷᱸÁ¶¸¦ Çϳª ¸¸µé¾î¼ À¯ÁöÇÏ´Â °ÍÀÌ´Ù.
¿©·¯°¡Áö ÀڷᱸÁ¶¸¦ »ý°¢ÇÒ¼ö Àִµ¥, ¿©±â¿¡¼´Â
multimapÀ» »ç¿ëÇϵµ·Ï Çß´Ù. key ´Â time ÀÌ µÉ°ÍÀε¥,
ÀÌ time ÀÌ ºÐ¸íÈ÷ °ãÄ¥¼ö ÀÖÀ»°ÍÀ̱⠶§¹®ÀÌ´Ù.
<screen>
multimap<int, map<key.value.ltstr>::iterator> garbage_collect;
</screen>
¾ÆÀ̵ð¾î´Â °£´ÜÇÏ´Ù. À§¿¡¼ ¿ì¸®°¡ map µ¥ÀÌŸ¸¦
ÀÔ·ÂÇÒ¶§ µ¿½Ã¿¡ À§ÀÇ garbage_collect ÀڷᱸÁ¶¿¡
mapµ¥ÀÌŸÀÇ iteraotr À» ÀԷ½ÃÄÑÁÖ´Â °ÍÀÌ´Ù.
±×¸®°í ÀÏÁ¤½Ã°£ÀÌ Áö³ª¸é garbage_collect ÀڷᱸÁ¶¸¦
¼øÈ¯ÇÏ¸é¼ ½Ã°£ÀÌ ÃʰúµÈ iterator ¿¡ ´ëÇØ¼
»èÁ¦¸¦ ÇØÁÖ¸é µÉ°ÍÀÌ´Ù. Æ÷ÀÎÅ͸¦ º°µµ·Î ÀúÀåÇØ³õ°í
Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇØ¼ garbage µ¥ÀÌŸ¸¦ »èÁ¦ÇØÁÖ´Â °Í°ú
ºñ½ÁÇÑ ¹æ½ÄÀÌ´Ù.
</para>
<para>
½Ã°£ º¹Àâµµ¸¦ °è»êÇØº¸¸é
garbage_collect ¿¡¼ ¿øÇÏ´Â ¹üÀ§ÀÇ ¿ø¼Ò¸¦ »èÁ¦Çϴµ¥
°É¸®´Â ½Ã°£ "O(log(size()) + N)", garbage_collect ¿¡¼
³ª¿Â iterator ¸¦ ÀÌ¿ëÇØ¼ »èÁ¦½Ã۴µ¥ °É¸®´Â
½Ã°£ O(1) + N, ip ¸¦ hash ·Î ¹Ù²Ù´Âµ¥ °É¸®´Â ½Ã°£ O(1) + N
Á¤µµ°¡ µÈ´Ù.
<screen>
O(log(size()) + N) + O(2N)
</screen>
N Àº »èÁ¦ÇؾßÇÒ ¿ø¼ÒÀÇ °¹¼öÀÌ´Ù. ¿¹¸¦µé¾î
1000000 °³ÀÇ µ¥ÀÌŸ¿¡¼ 100 °³ÀÇ µ¥ÀÌŸ¸¦ »èÁ¦Çؾß
ÇÑ´Ù°í °¡Á¤ÇßÀ»¶§, 6+100+200 = 306 Á¤µµ°¡
µÉ°ÍÀÌ´Ù.
</para>
<para>
hashvector ÀÇ Ã³À½ºÎÅÍ ³¡±îÁö ¼øÈ¯ÇÏ´Â
¹«½ÄÇÑ ¹æ¹ýÀ» »ç¿ëÇßÀ»°æ¿ì ¼øÈ¯¿¡ °É¸®´Â ½Ã°£ N ¿¡
ºñ±³Çϴµ¥ °É¸®´Â ½Ã°£, »èÁ¦Çϴµ¥ °É¸®´Â ½Ã°£µîÀ»
¿¹»óÇϸé ÃÖ¼Ò 2000000 ½Ã°£ÀÌ ¼Ò¸ðµÉ°ÍÀÌ´Ù.
(¼øÈ¯¿¡ °É¸®´Â ½Ã°£ 1000000 + ºñ±³Çϴµ¥ °É¸®´Â½Ã°£
1000000, °Å±â¿¡ »èÁ¦ÇÒ ¿ø¼Ò N°³)
</para>
<para>
±×·³ °£´ÜÇÏ°Ô Å×½ºÆ® Äڵ带 Çϳª ¸¸µé¾î º¸µµ·Ï
ÇϰڴÙ.
ºñ·Ï Å×½ºÆ® ÄÚµåÀ̱ä ÇÏÁö¸¸ "ÀÌÅÍ·¹ÀÌÅÍ ÀúÀå" ¾ÆÀ̵ð¾î°¡
Çö½ÇÀûÀÎÁö´Â È®ÀÎÇØ º¼¼ö ÀÖÀ» °ÍÀÌ´Ù.
</para>
<para>
<emphasis>¿¹Á¦ : iterator_map.cc</emphasis>
<screen>
#include <map>
#include <string>
#include <iostream>
using namespace std;
typedef struct _mydata
{
int age;
int num;
} mydata;
int main()
{
mydata md;
// map ÀڷᱸÁ¶¹× iterator ¼±¾ð
map<int, mydata> data[1024];
map<int, mydata>::iterator mi, my;
// iterator ¸¦ ÀúÀåÇϱâ À§ÇÑ map °ú
// À̰ÍÀÇ iterator ¼±¾ð
map<int, map<int,mydata>::iterator> garbage_map;
map<int, map<int,mydata>::iterator>::iterator mmi;
// Å×½ºÆ®¿ë µ¥ÀÌŸ ÀÔ·Â
md.age = 12;
md.num = 1;
data[0][1] = md;
md.age = 19;
md.num = 3;
data[0][3] = md;
md.age = 28;
md.num = 2;
data[0][2] = md;
md.age = 40;
md.num = 22;
data[0][4] = md;
md.age = 42;
md.num = 26;
data[0][5] = md;
md.age = 38;
md.num = 12;
data[0][6] = md;
// Å×½ºÆ®¿ë µ¥ÀÌŸ ÀÔ·Â Á¾·á
int i = 1;
mi = data[0].begin();
// Å×½ºÆ®¿ë µ¥ÀÌŸ¸¦ iterator ·Î ¼øÈ¯Çϸé¼
// ÇØ´ç iterator ¸¦ iterator ¸¦ ÀúÀåÇϱâ À§ÇÑ map ¿¡
// ÀÔ·Â
while(mi != data[0].end())
{
// ÀÔ·Â µð¹ö±ë¿ë Ãâ·Â
cout << mi->first << ": " << mi->second.num << ","
<< mi->second.age<< endl;
// iterator ¸¦ ÀڷᱸÁ¶¿¡ ÀúÀåÇÔ
garbage_map[i] = mi;
*mi++;
i++;
}
cout << "==============================" << endl;
// key ÀÇ °ªÀÌ 4º¸´Ù ´õÅ« ÀÌÅÍ·¹ÀÌÅ͸¦ ¸ðµÎ »èÁ¦ÇÑ´Ù.
mmi = garbage_map.find(4);
while(mmi != garbage_map.end())
{
cout << "erase " << endl;
data[0].erase(mmi->second);
*mmi++;
}
// garbage map ¿¡¼ ÇÊ¿ä¾ø´Â µ¥ÀÌŸ¸¦ »èÁ¦ÇÑ´Ù.
mmi = garbage_map.find(4);
garbage_map.erase(mmi, garbage_map.end());
cout << "iterator num " << garbage_map.size() << endl;
cout << "==============================" << endl;
// map µ¥ÀÌŸ¸¦ Ãâ·ÂÇÑ´Ù. µð¹ö±ë¿ë
mi = data[0].begin();
while(mi != data[0].end())
{
cout << mi->first << ": " << mi->second.num << ","
<< mi->second.age<< endl;
*mi++;
}
cout << "==============================" << endl;
}
</screen>
°£´ÜÇÏ°Ô Å×½ºÆ® °¡´ÉÇÒ °Å´Ù.
</para>
<para>
À§ÀÇ Äڵ带 ÀÀ¿ëÇÏ¸é µ¥ÀÌŸ »èÁ¦±îÁö ºü¸¥½Ã°£¿¡ °¡´ÉÇϵµ·Ï
Á»´õ ±×·²µíÇÑ Äڵ带 ¸¸µé¼ö ÀÖÀ»°ÍÀÌ´Ù.
</para>
</section>
</section>
</section>
<section>
<title>°á·Ð</title>
<para>
ÀÌ»ó °£´ÜÇÏ°Ô STL¿¡ ´ëÇÑ ¸î°¡Áö À̽´¿¡ ´ëÇØ¼ ¾Ë¾Æº¸¾Ò´Ù.
°³ÀÎÀûÀ¸·Î´Â DOS ATTACK °ËÃâÀ» À§ÇÑ Á»´õ ¿Ïº®ÇÑ ¿¹Á¦¸¦ µé¾îº¸°í
½Í¾úÀ¸³ª ±×·¸°Ô Çϱâ À§Çؼ± ÆÐŶĸÃÄ¿Í À̸¦ È¿À²ÀûÀ¸·Î ºÐ¼®Çؼ
°ËÃâÇØ ³»´Â ¹æ¹ý¿¡ ´ëÇØ¼ Á»´õ °í¹ÎÇØ¾ß Çϱ⠶§¹®¿¡(ÇѸ¶µð·Î ±ÍÂú¾Æ¼)
¿Ïº®ÇÑ ¿¹Á¦¸¦ ¸¸µéÁö´Â ¸øÇß´Ù.
</para>
<para>
±×·¸Áö¸¸ STL°ú Iterator ¿¡ ´ëÇÑ ¸î°¡Áö À̽´¿Í ÆÁÁ¤µµ´Â ¾ò¾úÀ»°Å¶ó°í
»ý°¢ÇÑ´Ù.
</para>
<para>
¾ðÁ¨°¡ ÀÌ ¹®¼ÀÇ ÈļӯíÀÌ ¸¸µé¾îÁö¸é Á»´õ ¿Ïº®ÇÑ ¿¹Á¦¸¦ Æ÷ÇÔ½Ã۵µ·Ï ÇϰڴÙ.
</para>
</section>
</article>
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|