niedziela, 5 stycznia 2014

PS Overloading MD5

Funkcja skrótu MD5 jest powszechnie używana i można ją zastosować do wielu danych wejściowych. Możemy skorzystać z wywołaniem overloadowanej funkcji, która pobiera różne typy danych i zawsze zwraca taki sam typ danych. Pierwsze co nam przychodzi do głowy to napisanie kilku funkcji o takiej samej nazwie, ale różnych parametrach:
function Get-MD5 ([string]$word)
{
    $utf8 = new-object -TypeName System.Text.UTF8Encoding
    [byte[]]$bytes = $utf8.GetBytes($word)
    return Get-MD5( $bytes)
}

function Get-MD5([ System.IO.FileInfo] $file)
{
    $bytes = [System.IO.File]::ReadAllBytes($file.FullName)
    return Get-MD5($bytes)
}

function Get-MD5([byte[]] $bytes)
{
    $md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
    $hash = [System.BitConverter]::ToString($md5.ComputeHash($bytes))
    return $hash 
}
Ale niestety mamy problem z wywołaniem funkcji innych niż ta pierwsza zdefiniowana funkcja. Jednak, możesz zapisać funkcje z wieloma parametrami:
function Get-MD5
{
    [CmdletBinding(DefaultParametersetName="s")] 
    param
    (
    [Parameter(ParameterSetName="b",Position=0)] 
    [byte[]] $b,

    [Parameter(ParameterSetName="f", Position=0)] 
    [ System.IO.FileInfo] $f,

    [Parameter(ParameterSetName="s", Position=0)] 
    [string]$s
)

$utf8 = new-object -TypeName System.Text.UTF8Encoding
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider

 switch ($PsCmdlet.ParameterSetName) 
    { 
#    "b"  { 
#            $md5Bytes = $md5.ComputeHash($bytes); 
#            break
#            }
 
    "f"  { 
            $b = [System.IO.File]::ReadAllBytes($f.FullName)
            break
            } 
    "s" {
            [byte[]]$b = $utf8.GetBytes($s);
            break;
        }
    } 

    $md5Bytes = $md5.ComputeHash($b); 
    $hash = [System.BitConverter]::ToString( $md5Bytes )
    return $hash 
}
Tutaj pierwsze skrzypce gra parametr $PsCmdlet.ParameterSetName. Po nim możemy określić jaki parametr był zdefiniowany. Poniżej przykładowe użycia funkcji Get-MD5 z różnymi typami parametrów:
Get-MD5 "Hello world"
get-MD5  (Get-Item "file.zip")  
get-md5 1
get-md5 ([Byte] 0x4D)
Jak chcesz sprawdzić funkcje skrótu to możesz skorzystać z tego linka.

Brak komentarzy:

Prześlij komentarz