PSCompareHash.psm1

function Get-ObjectHash {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true, Position=0)]
        [string]$InputObject,  # <== This is important!

        [Parameter(Position=1)]
        [ValidateSet("SHA1", "SHA256", "SHA384", "SHA512", "MD5")]
        [string]$Algorithm = "SHA256"
    )

    if (Test-Path $InputObject -PathType Leaf) {
        return (Get-FileHash -Path $InputObject -Algorithm $Algorithm).Hash
    }
    elseif (Test-Path $InputObject -PathType Container) {
        $fileHashes = Get-ChildItem -Path $InputObject -Recurse -File |
            Sort-Object FullName |
            ForEach-Object { Get-FileHash -Path $_.FullName -Algorithm $Algorithm } |
            Select-Object -ExpandProperty Hash

        $finalHash = [System.Security.Cryptography.HashAlgorithm]::Create($Algorithm)
        $bytes = [System.Text.Encoding]::UTF8.GetBytes(($fileHashes -join ""))
        $hashBytes = $finalHash.ComputeHash($bytes)

        return -join ($hashBytes | ForEach-Object { $_.ToString("x2") })
    }
    else {
        Write-Error "Invalid path provided: $InputObject"
        return $null
    }
}



function Test-FileHash {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true, Position=0)]
        [string]$FilePath,

        [Parameter(Mandatory=$true, Position=1)]
        [string]$ProvidedHash,

        [Parameter(Position=2)]
        [ValidateSet("SHA1", "SHA256", "SHA384", "SHA512", "MD5")]
        [string]$Algorithm = "SHA256"
    )

    if (-not (Test-Path $FilePath)) {
        Write-Error "The specified path does not exist: $FilePath"
        return $false
    }

    # Use Get-ObjectHash for hashing files and directories
    $computedHash = Get-ObjectHash -InputObject $FilePath -Algorithm $Algorithm

    # Compare hashes
    if ($computedHash -eq $ProvidedHash) {
        Write-Output "The hash matches."
        return $true
    } else {
        Write-Output "The hash does not match."
        return $false
    }
}