#r
#r
Вопрос:
Предположим, я хочу обработать файл изображения, а затем сохранить его на диске, используя его md5-хэш в качестве имени файла. Наивный подход включал бы следующие шаги:
- сохраните обработанное изображение с произвольным именем;
- создайте соединение с обработанным файлом изображения в R, используя
file(file_name, "rb")
; - примените функцию типа
openssl::md5()
к соединению, чтобы получить md5-хэш; - переименуйте файл, используя md5-хэш.
Однако это кажется неэффективным, поскольку второй и третий шаги требуют дополнительного ввода-вывода с диска.
Мне интересно, есть ли способ сгенерировать поддельный файл в памяти, чтобы его openssl::md5()
можно было напрямую применить для получения той же суммы md5 без необходимости сначала сохранять файл на диске.
Возможно ли это? Если да, то как это сделать?
Ответ №1:
Перекрестный постинг моего ответа на reddit:
Подсказка — это страница справки к openssl::md5
, в которой говорится, что входным объектом может быть необработанный вектор. Итак:
msg <- "The quick brown fox"
openssl::md5(charToRaw(msg))
md5 a2:00:4f: 37:73:0b: 94:45:67:0a: 73:8f: a0: fc: 9e: e5
сравните с:
writeBin(charToRaw("The quick brown fox"), 'tmp.dat', useBytes=TRUE)
system('md5 tmp.dat')
MD5 (tmp.dat) = a2004f37730b9445670a738fa0fc9ee5
Выдает тот же результат.
Комментарии:
1. Я полагаю, что этот подход работает только для символьных векторов, верно? Как насчет других типов объектов? Интересно, есть ли способ сохранить объект в стандартный вывод, а затем прочитать вывод с помощью
file()
, а затем хэшировать его?2. тогда о каких данных вы говорите?
intToBits
работает так же, как указано выше, для целых чисел. Вы можете передавать данные в стандартный вывод и обратно, но я не подозреваю, что вы увидите большое преимущество в производительности по сравнению с использованием реального файла.