Private/Get-MetadataHash.ps1

Function Get-MetadataHash {
    param
    (
        [Microsoft.Xrm.Tooling.Connector.CrmServiceClient]$targetConn,
        [Microsoft.Xrm.Tooling.Connector.CrmServiceClient]$sourceConn
    )
    
    Write-Verbose "Getting source metadata..."
    $sourceMetadata = Get-CrmEntityAllMetadata -Conn $sourceConn -EntityFilters All

    Write-Verbose "Getting target metadata..."
    $targetMetadata = Get-CrmEntityAllMetadata -Conn $targetConn -EntityFilters All

    Write-Verbose "Generating hashes from metadata..."
    $Metadata = @{
        "Source" = @{
            "All"        = $sourceMetadata | MetadataToHash;
            "Attributes" = $sourceMetadata.Attributes | MetadataToHash;
            "BySchemaName" = @{
                "All"        = $sourceMetadata | MetadataToHash -BySchemaName;
                "Attributes" = $sourceMetadata.Attributes | MetadataToHash -BySchemaName;
            } 
        };
        "Target" = @{
            "All"        = $targetMetadata | MetadataToHash;
            "Attributes" = $targetMetadata.Attributes | MetadataToHash;
            "BySchemaName" = @{
                "All"        = $targetMetadata | MetadataToHash -BySchemaName;
                "Attributes" = $targetMetadata.Attributes | MetadataToHash -BySchemaName;
            } 
        }
    }

    Write-Output $Metadata
}