functions/azure/Get-UniqueSuffix.ps1

# <copyright file="Get-UniqueSuffix.ps1" company="Endjin Limited">
# Copyright (c) Endjin Limited. All rights reserved.
# </copyright>

<#
.SYNOPSIS
Generates a unique suffix to use for resource names.

.DESCRIPTION
Generates a deterministic hash from a set of inputs, and returns an 12 character alphabetic string to use as a resource name suffix.

.PARAMETER SubscriptionId
The subscription ID of the target Azure subscription.

.PARAMETER StackName
The name of the deployment stack, which is a grouping for what may be multiple services (e.g. a Marain stack).

.PARAMETER ServiceInstance
The instance ID of the service for the deployment.

.PARAMETER Environment
The name of the environment for the deployment.
#>


function Get-UniqueSuffix
{
    [CmdletBinding()]
    param
    (
        [Parameter(Position=0)]
        [string] $SubscriptionId,

        [Parameter(Position=1)]
        [string] $StackName,

        [Parameter(Position=2)]
        [string] $ServiceInstance,

        [Parameter(Position=3)]
        [string] $Environment
    )

    function Get-UniqueString ([string]$id, $length=12)
    {
        $hashArray = (New-Object System.Security.Cryptography.SHA512Managed).ComputeHash($id.ToCharArray())
        -join ($hashArray[1..$length] | ForEach-Object { [char]($_ % 26 + [byte][char]'a') })
    }

    $inputString = "{0}__{1}__{2}__{3}" -f $SubscriptionId, $StackName, $ServiceInstance, $Environment
    return Get-UniqueString $inputString
}