Имитация функции uniqueString Azure ARM

Мне нужно развернуть базы данных Sql на сервере Azure Sql, используя следующие способы: способ шаблона ARM и более индивидуальный способ с использованием кода C#. Существует шаблонная функция ARM под названием uniqueString(string), которая генерирует псевдослучайный хэш заданной строки. Это детерминированная чистая функция.

Мне нужно найти способ точно имитировать поведение этой функции из моего кода C#. т.е. мне нужно воспроизвести эту функцию в моем коде C#.

Где я могу найти алгоритм, используемый ARM Api?

справочник MSDN для uniqueString ()


person Loul G.    schedule 08.04.2017    source источник
comment
Я все еще хотел бы сделать это каким-то образом, не требующим получения комплекта концентратора стека Azure.   -  person Pablo Jomer    schedule 21.06.2021


Ответы (3)


Я нашел код PowerShell для этого здесь: https://blogs.technet.microsoft.com/389thoughts/2017/12/23/get-uniquestring-generate-unique-id-for-azure-deployments/

Я преобразовал этот код в С#:

public string GetUniqueString(string id, int length = 13)
{
    string result = "";
    var buffer = System.Text.Encoding.UTF8.GetBytes(id);
    var hashArray = new System.Security.Cryptography.SHA512Managed().ComputeHash(buffer);
    for(int i = 1; i <= length; i++)
    {
        var b = hashArray[i];
        var c = Convert.ToChar((b % 26) + (byte)'a');
        result = result + c;
    }

    return result;
}
person JoshSchlesinger    schedule 17.01.2018
comment
Это не соответствует ожидаемому результату шаблона развертывания ARM. попробуйте uniqueString('tyeth') в качестве единственного выходного параметра в шаблоне руки, а затем протестируйте эту функцию или любые аналогичные предложения по переполнению стека. Я возвращаю "zcztcwvu6iyg6" из Azure. - person Tyeth; 12.04.2021
comment
Для меня ни эта функция, ни оригинальный опубликованный Powershell не помогают... - person waeltken; 03.05.2021

Я сам исследовал это время от времени в течение несколько лет и наконец-то наткнулся на деньги...

// "zcztcwvu6iyg6"
var unique = ArmUniqueString("tyeth");

Моя функция ArmUniqueString представляет собой оболочку для некоторых библиотек DLL, которые распространяются с Комплект разработки Azure Stack Hub, который представляет собой образ виртуальной машины, содержащий серверную платформу Azure, которую можно запускать локально...

private static string ArmUniqueString(string originalString)
{

    var assembly = Assembly.GetAssembly(
        typeof(Microsoft.WindowsAzure.ResourceStack.Frontdoor.Templates.Engines.TemplateEngine)
    );

    var functions = assembly.GetType(
        "Microsoft.WindowsAzure.ResourceStack.Frontdoor.Templates.Expressions.TemplateExpressionBuiltInFunctions"
    );

    var uniqueString = functions.GetMethod(
        "UniqueString",
        BindingFlags.Static | BindingFlags.NonPublic
    );

    var parameters = new object[] {
        "uniqueString",
        new JToken[] {
            (JToken)originalString
        }
    };

    var result = uniqueString.Invoke(null, parameters).ToString();

    return result;

}

Вам потребуется загрузить пакет разработки Azure Stack Hub и распаковать его, чтобы получить библиотеки DLL:

  • Скачайте комплект средств разработки Azure Stack Hub – предупреждение : это около 22Gb!
  • Запустите установщик, чтобы распаковать 55Gb *.vhdx
  • Смонтируйте *.vhdx или разверните/распакуйте его локально
  • Inside the *.vhdx, find this file and unzip it somewhere:
    • CloudBuilder\CloudDeployment\NuGetStore\Microsoft.AzureStack.Setup.Services.ResourceManager.5.20.1335.300.nupkg
  • Папка content\Website\bin внутри *.nupkg содержит необходимые dll

Чтобы использовать их, добавьте ссылку на сборку в Microsoft.WindowsAzure.ResourceStack.Frontdoor.Templates.dll (у нее есть некоторые зависимости от других файлов в папке bin), которая содержит класс TemplateExpressionBuiltInFunctions. Приведенный выше код просто использует отражение для вызова закрытой функции UniqueString из этой сборки с небольшой работой по маршалированию параметров в соответствующие типы JToken.

Если вы хотите покопаться в деталях реализации, вы, вероятно, могли бы запустить декомпилятор для сборки, чтобы узнать, что она делает под обложками...

Примечание. Кредиты идут в эту статью в блоге за указание меня в правильном направлении:

https://the.agilesql.club/2017/12/azure-arm-template-function-internals/

person mclayton    schedule 05.05.2021
comment
Это ужасно и гениально, спасибо - person Tyeth; 05.07.2021

Наконец-то я нашел обходной путь. Я использовал очень простой шаблон ARM, целью которого является вывод только результата команды uniqueString. Затем я получаю этот вывод в своем коде C#. Это решение на самом деле не самое быстрое ;-), но оно работает так, как хотелось бы.

person Loul G.    schedule 14.12.2017