"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Perl 및 Go에서 비밀번호 강도 및 숫자 유효성 검사 탐색

Perl 및 Go에서 비밀번호 강도 및 숫자 유효성 검사 탐색

2024년 11월 18일에 게시됨
검색:150

Exploring Password Strength and Number Validation in Perl and Go

이 기사에서는 Perl Weekly Challenge #287의 두 가지 과제인 취약한 비밀번호 강화 및 숫자 유효성 검사에 대해 설명합니다. 저는 Perl과 Go의 구현을 보여주며 두 작업에 대한 솔루션을 제공할 것입니다.

목차

  1. 취약한 비밀번호 강화
  2. 번호 확인 중
  3. 결론

취약한 비밀번호 강화

첫 번째 작업은 강력한 비밀번호를 만드는 데 필요한 최소 변경 횟수를 결정하는 것입니다. 강력한 비밀번호의 기준은 다음과 같습니다.

  1. 6자 이상이어야 합니다.
  2. 소문자, 대문자, 숫자가 각각 1개 이상 포함됩니다.
  3. 3개의 동일한 문자가 연속으로 포함되어 있지 않습니다.

  • 입력: "a" → 출력: 5
  • 입력: "aB2" → 출력: 3
  • 입력: "PaaSW0rd" → 출력: 0
  • 입력: "Paaasw0rd" → 출력: 1
  • 입력: "aaaaa" → 출력: 2

해결책

펄 구현

#!/usr/bin/perl
use strict;
use warnings;
use List::Util 'max';

# Function to count groups of three or more repeating characters
sub count_repeats {
    my ($str) = @_;
    my $repeats = 0;

    # Find repeating characters and count the required changes
    while ($str =~ /(.)\1{2,}/g) {
        $repeats  = int(length($&) / 3);
    }

    return $repeats;
}

# Function to calculate the minimum steps to create a strong password
sub minimum_steps_to_strong_password {
    my ($str) = @_;
    my $length = length($str);

    # Check if the password contains the required character types
    my $has_lower = $str =~ /[a-z]/;
    my $has_upper = $str =~ /[A-Z]/;
    my $has_digit = $str =~ /\d/;

    # Calculate the number of types needed
    my $types_needed = !$has_lower   !$has_upper   !$has_digit;
    my $repeats = count_repeats($str);

    # Return the minimum steps based on the length of the password
    return ($length 



Perl 구현을 위한 테스트

use strict;
use warnings;
use Test::More;
require "./ch-1.pl";

my @tests = (
    ["a", 5],
    ["aB2", 3],
    ["PaaSW0rd", 0],
    ["Paaasw0rd", 1],
    ["aaaaa", 2],
);

foreach my $test (@tests) {
    my ($input, $expected) = @$test;
    my $result = minimum_steps_to_strong_password($input);
    is($result, $expected, "Input: '$input'");
}

done_testing();

구현으로 이동

package main

import (
    "regexp"
)

func countRepeats(password string) int {
    repeats := 0
    count := 1

    for i := 1; i  b {
        return a
    }
    return b
}

Go 구현을 위한 테스트

package main

import (
    "testing"
)

func TestMinimumStepsToStrongPassword(t *testing.T) {
    tests := []struct {
        password string
        expected int
    }{
        {"a", 5},
        {"aB2", 3},
        {"PaaSW0rd", 0},
        {"Paaasw0rd", 1},
        {"aaaaa", 2},
    }

    for _, test := range tests {
        result := minimumStepsToStrongPassword(test.password)
        if result != test.expected {
            t.Errorf("For password '%s', expected %d but got %d", test.password, test.expected, result)
        }
    }
}

숫자 확인

두 번째 작업에는 숫자 확인이 포함됩니다. 목표는 주어진 문자열이 유효한 숫자를 나타내는지 여부를 확인하는 것입니다. 유효한 숫자의 기준은 다음과 같습니다.

  1. 지수 표기법이 뒤따르는 정수입니다.
  2. 선택적으로 지수 표기법이 뒤따르는 10진수입니다.
  3. 정수에는 선택적으로 기호(- 또는 ) 뒤에 숫자가 올 수 있습니다.

  • 입력: "1" → 출력: true
  • 입력: "a" → 출력: false
  • 입력: "." → 출력: 거짓
  • 입력: "1.2e4.2" → 출력: false
  • 입력: "-1." → 출력: 참
  • 입력: " 1E-8" → 출력: true
  • 입력: ".44" → 출력: true

해결책

펄 구현

#!/usr/bin/perl
use strict;
use warnings;

sub is_valid_number {
    my ($str) = @_;

    # Regex for valid numbers
    my $regex = qr{
        ^            # Start of the string
        [ -]?        # Optional sign
        (?:          # Start of the number group
            \d       # Integer: at least one digit
            (?:      # Start of the optional decimal part
                \.   # Decimal point
                \d*  # Followed by zero or more digits
            )?       # Group is optional
            |        # or
            \.       # Just a decimal point
            \d       # Followed by one or more digits
        )            # End of the number group
        (?:          # Start of the optional exponent group
            [eE]     # 'e' or 'E'
            [ -]?    # Optional sign
            \d       # Followed by one or more digits
        )?           # Exponent is optional
        $            # End of the string
    }x;

    # Return 1 for valid, 0 for invalid
    return $str =~ $regex ? 1 : 0;
}

1;

Perl 구현을 위한 테스트

#!/usr/bin/perl
use strict;
use warnings;
use Test::More;

require './ch-2.pl';

# Define test cases
my @test_cases = (
    ["1", 1, 'Valid integer'],
    ["a", 0, 'Invalid input'],
    [".", 0, 'Single dot'],
    ["1.2e4.2", 0, 'Invalid exponent'],
    ["-1.", 1, 'Valid decimal'],
    [" 1E-8", 1, 'Valid scientific notation'],
    [".44", 1, 'Valid decimal starting with dot'],
);

# Loop through test cases and run tests
foreach my $case (@test_cases) {
    my $result = is_valid_number($case->[0]);
    is($result, $case->[1], $case->[2]);
}

done_testing();

구현으로 이동

package main

import (
    "regexp"
)

// isValidNumber checks if the given string is a valid number.
func isValidNumber(str string) bool {
    regex := `^[ -]?((\d (\.\d*)?)|(\.\d ))([eE][ -]?\d )?$`
    matched, _ := regexp.MatchString(regex, str)
    return matched
}

Go 구현을 위한 테스트

package main

import (
    "testing"
)

func TestIsValidNumber(t *testing.T) {
    testCases := []struct {
        input    string
        expected bool
    }{
        {"1", true},
        {"a", false},
        {".", false},
        {"1.2e4.2", false},
        {"-1.", true},
        {" 1E-8", true},
        {".44", true},
    }

    for _, tc := range testCases {
        result := isValidNumber(tc.input)
        if result != tc.expected {
            t.Errorf("isValidNumber(%q) = %v; expected %v", tc.input, result, tc.expected)
        }
    }
}

결론

이러한 솔루션은 비밀번호 강도를 평가하고 숫자의 정확성을 검증하는 효과적인 방법을 제공합니다. 두 작업에 대한 전체 코드는 GitHub에서 확인할 수 있습니다.

릴리스 선언문 이 기사는 https://dev.to/applgr/exploring-password-strength-and-number-validation-in-perl-and-go-529p?1에서 복제됩니다. 침해가 있는 경우에는 Study_golang@163으로 문의하시기 바랍니다. .com에서 삭제하세요
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3