Дайджест — получение разных значений во всех строках при изменении только одной

#r #encryption #mask #digest #anonymize

#r #шифрование #маска #дайджест #анонимизация

Вопрос:

Я пытаюсь создать блестящее приложение, которое позволяет пользователю выбирать столбцы для шифрования, где значения в каждой строке всегда должны быть одинаковыми при последующих запусках, если данные одинаковы. Т.е. Если имя клиента = «John», вы всегда получаете «A» при запуске этого процесса, еслиимя клиента меняется на «Jon», вы можете получить «C»… но если изменить обратно на «John», вы снова получите A. Это будет использоваться для «маскировки» конфиденциальных данных для анализа.

Кроме того, если кто-нибудь может указать способ «расшифровки» этих столбцов путем сохранения ключа для последующего использования… это было бы оценено.

Упрощенная версия того, как я пытаюсь это сделать (требуется библиотека дайджеста):

 test <- data.frame(CustomerName=c("John Snow","John Snow","Daffy Duck","Daffy Duck","Daffy Duck","Daffy Duck","Daffy Duck","Joe Farmer","Joe Farmer","Joe Farmer","Joe Farmer"),
               LoanNumber=c("12548","45878","45796","45813","45125","45216","45125","45778","45126","32548","45683"),
               LoanBalance=c("458463","5412548","458463","5412548","458463","5412548","458463","5412548","458463","5412548","2484722"),
               FarmType=c("Hay","Dairy","Fish","Hay","Dairy","Fish","Hay","Dairy","Fish","Hay","Dairy"))


test[,1] <- sapply(test[,1],digest,algo="sha1")
 

Пример вывода:

                                    CustomerName LoanNumber LoanBalance FarmType
1  5c96f777a14f201a6a9b79623d548f7ab61c7a11      12548      458463      Hay
2  5c96f777a14f201a6a9b79623d548f7ab61c7a11      45878     5412548    Dairy
3  10bf345ab114c20df2d1eedbbe7e7cd6b969db05      45796      458463     Fish
4  10bf345ab114c20df2d1eedbbe7e7cd6b969db05      45813     5412548      Hay
5  10bf345ab114c20df2d1eedbbe7e7cd6b969db05      45125      458463    Dairy
6  10bf345ab114c20df2d1eedbbe7e7cd6b969db05      45216     5412548     Fish
7  10bf345ab114c20df2d1eedbbe7e7cd6b969db05      45125      458463      Hay
8  b0db86a39b9617cef61a8986fd57af7960eec9f4      45778     5412548    Dairy
9  b0db86a39b9617cef61a8986fd57af7960eec9f4      45126      458463     Fish
10 b0db86a39b9617cef61a8986fd57af7960eec9f4      32548     5412548      Hay
11 b0db86a39b9617cef61a8986fd57af7960eec9f4      45683     2484722    Dairy
 

Измененный фрейм данных (удален ‘h’ в John):

     test <- data.frame(CustomerName=c("Jon Snow","Jon Snow","Daffy Duck","Daffy Duck","Daffy Duck","Daffy Duck","Daffy Duck","Joe Farmer","Joe Farmer","Joe Farmer","Joe Farmer"),
           LoanNumber=c("12548","45878","45796","45813","45125","45216","45125","45778","45126","32548","45683"),
           LoanBalance=c("458463","5412548","458463","5412548","458463","5412548","458463","5412548","458463","5412548","2484722"),
           FarmType=c("Hay","Dairy","Fish","Hay","Dairy","Fish","Hay","Dairy","Fish","Hay","Dairy"))
test[,1] <- sapply(test[,1],digest,algo="sha1")
 

Новый вывод:

                                    CustomerName LoanNumber LoanBalance FarmType
1  2cabeabb3b50e04d3b46ea2c68ab12c7350cd87f      12548      458463      Hay
2  2cabeabb3b50e04d3b46ea2c68ab12c7350cd87f      45878     5412548    Dairy
3  b0187b6ff2322fa86004d4d22cd479f3cdc345d2      45796      458463     Fish
4  b0187b6ff2322fa86004d4d22cd479f3cdc345d2      45813     5412548      Hay
5  b0187b6ff2322fa86004d4d22cd479f3cdc345d2      45125      458463    Dairy
6  b0187b6ff2322fa86004d4d22cd479f3cdc345d2      45216     5412548     Fish
7  b0187b6ff2322fa86004d4d22cd479f3cdc345d2      45125      458463      Hay
8  2127453066c45db6ba7e2f6f8c14d22796c3fd54      45778     5412548    Dairy
9  2127453066c45db6ba7e2f6f8c14d22796c3fd54      45126      458463     Fish
10 2127453066c45db6ba7e2f6f8c14d22796c3fd54      32548     5412548      Hay
11 2127453066c45db6ba7e2f6f8c14d22796c3fd54      45683     2484722    Dairy
 

Чего я ожидал:

     CustomerName LoanNumber LoanBalance FarmType
1  2cabeabb3b50e04d3b46ea2c68ab12c7350cd87f      12548      458463      Hay
2  2cabeabb3b50e04d3b46ea2c68ab12c7350cd87f      45878     5412548    Dairy
3  10bf345ab114c20df2d1eedbbe7e7cd6b969db05      45796      458463     Fish
4  10bf345ab114c20df2d1eedbbe7e7cd6b969db05      45813     5412548      Hay
5  10bf345ab114c20df2d1eedbbe7e7cd6b969db05      45125      458463    Dairy
6  10bf345ab114c20df2d1eedbbe7e7cd6b969db05      45216     5412548     Fish
7  10bf345ab114c20df2d1eedbbe7e7cd6b969db05      45125      458463      Hay
8  b0db86a39b9617cef61a8986fd57af7960eec9f4      45778     5412548    Dairy
9  b0db86a39b9617cef61a8986fd57af7960eec9f4      45126      458463     Fish
10 b0db86a39b9617cef61a8986fd57af7960eec9f4      32548     5412548      Hay
11 b0db86a39b9617cef61a8986fd57af7960eec9f4      45683     2484722    Dairy
 

Я неправильно понимаю, как это работает? Если я применяю одну и ту же логику к нескольким столбцам, я получаю одинаковые значения для неизмененного столбца, но проблема сохраняется для столбца с измененными значениями. Я попытался векторизовать функцию digest, чтобы убедиться, что моя функция sapply не была проблемой с теми же результатами. Есть идеи?

Ответ №1:

Я думаю, что я ответил на свой собственный вопрос … конечно, сразу после публикации его здесь :).

Функция digest имеет параметр serialize со следующей документацией: Логическая переменная, указывающая, следует ли сериализовать объект с помощью serialize (в форме ASCII). Установка этого значения в FALSE позволяет сравнивать вывод дайджеста заданных символьных строк с известным выводом управления. Это также позволяет использовать необработанные векторы, такие как выходные данные сериализации, отличной от ASCII.

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

пример:

 test[,1] <- sapply(test[,1],digest,algo="sha1",serialize = FALSE)