Попытка сгенерировать уникальный идентификатор, который не является ни целым числом, ни точно другими значениями в открытом тексте - PullRequest
1 голос
/ 03 июня 2019

Я помогаю коллеге, которого попросили сгенерировать идентификатор ключа для двух разных групп входящих данных. Я выполнил этот шаг, но он не очень удобен для пользователя, поэтому я ищу предложения о том, как сделать это более читабельно. Каждая группа имеет свой собственный идентификатор, который представляется шестнадцатеричным значением. Их объединение представляется уникальным ключом само по себе. В этом случае таблица Домохозяйства и таблица Счета объединяются, и ее попросили сгенерировать по значению Счета домохозяйства (домохозяйство может иметь много счетов, счет может охватывать домохозяйства).

Наши данные хранятся на сервере SQL, но большинство наших манипуляций мы выполняем с использованием SAS, следовательно, PROC SQL ниже.

Моя первоначальная мысль заключалась в том, что наиболее очевидным ключом является совместное использование двух ключевых полей и использование разделителя. Вы увидите это в верхней части моего кода. Однако это делает поле очень длинным, поэтому меня попросили сократить его. Моей второй мыслью и их первоначальным вопросом было просто заполнить целочисленное поле. Вы можете видеть это с Monotonic, но они чувствовали, что, так как в Интернете есть предупреждения об этом, они не доверяют этому. Моя третья мысль состояла в том, чтобы пропустить существующее сцепленное поле через какую-то одностороннюю функцию, но когда я это делаю (см. MD5 ниже), я получаю нечто, похожее на крылышки.

/*  creating a table of just the "key" columns */
PROC SQL;
    CREATE TABLE work.ConcatonatedKey AS
        SELECT DISTINCT 
           CATX("G", HouseholdKey,FinancialKey) as Concatonated
        FROM work.OriginalData
    ;
QUIT;

/*  Populate HHFinancialKey */
/* Monotonic documentation */
/*  http://support.sas.com/techsup/notes/v8/15/138.html  */
PROC SQL;
    CREATE TABLE work.ContrivedKeys AS
        SELECT 
              Monotonic() AS HHFinID
            , Concatonated
            , MD5(Concatonated) As foo
        FROM work.ConcatonatedKey
    ;
QUIT;

Итак, настоящий вопрос здесь заключается в том, что если у вас есть что-то, что может однозначно идентифицировать строку, но вы хотите сделать ее более удобной для пользователя, используя SAS, как бы вы поступили?

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Функция SAS UUIDGEN может возвращать либо читаемую человеком символьную строку, либо более плотную двоичную строку.По документам:

Функция UUIDGEN возвращает UUID (уникальное значение) для каждой ячейки.Результат по умолчанию составляет 36 символов и выглядит следующим образом:

5ab6fa40-426b-4375-bb22-2d0291f43319.

Двоичный результат имеет длину 16 байтов.

Пример:

select
  ... 
  uuidgen() as myGroupId length=36
...
1 голос
/ 03 июня 2019

MD5, вероятно, самое простое решение.В результате функция MD5 возвращает 16-байтовую строку, но чтобы сделать ее удобочитаемой для человека, вы можете просто отформатировать ее, используя формат $hex32..Это также очень быстро и широко поддерживается.

data _null_;
  x = put(md5("some_string_here"),$hex32.);
  put x;
run;

Результат:

BB28824D60AE6706F812CC940CAAAF1B

Только будьте осторожны, что md5() чувствителен к различиям в регистре и пробелам в начале / в конце.Таким образом, вы можете захотеть / нужно перебрать все и обрезать пробелы перед выполнением этой функции для получения согласованных результатов на разных платформах.

Риск столкновений близок к нулю:

Сколько случайных элементов перед тем, как MD5 вызовет коллизии?

Следует также отметить, что, зная два нехэшированных ключа, используемых для создания хэша, вы можете воссоздать хеш из ключей, что невозможнос решением uuidgen, выбранным в качестве ответа.В зависимости от ваших требований это может или не может быть требованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...