ArrayCountValueTop 统计IP地址段存活数量并返回TOP N结果
(arrInit []string, length int, flag bool)
| 631 | |
| 632 | // ArrayCountValueTop 统计IP地址段存活数量并返回TOP N结果 |
| 633 | func ArrayCountValueTop(arrInit []string, length int, flag bool) (arrTop []string, arrLen []int) { |
| 634 | if len(arrInit) == 0 { |
| 635 | return |
| 636 | } |
| 637 | |
| 638 | // 统计各网段出现次数,预分配容量 |
| 639 | segmentCounts := make(map[string]int, len(arrInit)/4) |
| 640 | for _, ip := range arrInit { |
| 641 | segments := strings.Split(ip, ".") |
| 642 | if len(segments) != 4 { |
| 643 | continue |
| 644 | } |
| 645 | |
| 646 | // 根据flag确定统计B段还是C段 |
| 647 | var segment string |
| 648 | if flag { |
| 649 | segment = fmt.Sprintf("%s.%s", segments[0], segments[1]) // B段 |
| 650 | } else { |
| 651 | segment = fmt.Sprintf("%s.%s.%s", segments[0], segments[1], segments[2]) // C段 |
| 652 | } |
| 653 | |
| 654 | segmentCounts[segment]++ |
| 655 | } |
| 656 | |
| 657 | // 创建副本用于排序 |
| 658 | sortMap := make(map[string]int) |
| 659 | for k, v := range segmentCounts { |
| 660 | sortMap[k] = v |
| 661 | } |
| 662 | |
| 663 | // 获取TOP N结果 |
| 664 | for i := 0; i < length && len(sortMap) > 0; i++ { |
| 665 | maxSegment := "" |
| 666 | maxCount := 0 |
| 667 | |
| 668 | // 查找当前最大值 |
| 669 | for segment, count := range sortMap { |
| 670 | if count > maxCount { |
| 671 | maxCount = count |
| 672 | maxSegment = segment |
| 673 | } |
| 674 | } |
| 675 | |
| 676 | // 添加到结果集 |
| 677 | arrTop = append(arrTop, maxSegment) |
| 678 | arrLen = append(arrLen, maxCount) |
| 679 | |
| 680 | // 从待处理map中删除已处理项 |
| 681 | delete(sortMap, maxSegment) |
| 682 | } |
| 683 | |
| 684 | return |
| 685 | } |
| 686 | |
| 687 | // ============================================================================= |
| 688 | // TCP 补充探测 - 当 ICMP 响应率过低时自动启用 |
no outgoing calls