Как создать поддельный двоичный файл для объекта в R, чтобы получить его md5-хэш?

#r

#r

Вопрос:

Предположим, я хочу обработать файл изображения, а затем сохранить его на диске, используя его md5-хэш в качестве имени файла. Наивный подход включал бы следующие шаги:

  1. сохраните обработанное изображение с произвольным именем;
  2. создайте соединение с обработанным файлом изображения в R, используя file(file_name, "rb") ;
  3. примените функцию типа openssl::md5() к соединению, чтобы получить md5-хэш;
  4. переименуйте файл, используя 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 работает так же, как указано выше, для целых чисел. Вы можете передавать данные в стандартный вывод и обратно, но я не подозреваю, что вы увидите большое преимущество в производительности по сравнению с использованием реального файла.