library(httr) library(digest) library(base64enc) hex_to_raw <- function(hex_string) { result <- raw(0) if (nchar(hex_string) > 0) { as.raw( strtoi( substring( hex_string, seq(1, nchar(hex_string), by=2), seq(2, nchar(hex_string), by=2) ), 16L ) ) -> result } result } base32_encode <- function(raw_data) { alphabet <- c(LETTERS[1:26], as.character(0:5)) bits <- as.integer(rawToBits(raw_data)) n_bits <- length(bits) padding_needed <- (8 - (n_bits %% 40) %% 8) %% 8 bits <- c(bits, rep(0, padding_needed)) n_bits <- length(bits) result <- character(n_bits %/% 5) for (i in seq(1, n_bits, by=5)) { if (i+4 <= n_bits) { value <- sum(bits[i:(i+4)] * 2^(4:0)) result[i %/% 5 + 1] <- alphabet[value + 1] } } if (padding_needed > 0) { padding_chars <- padding_needed %/% 8 * 8 result <- c(result[1:(length(result) - padding_chars / 5)], rep("=", padding_chars / 5)) } paste(result, collapse="") } process_url <- function(url) { response <- httr::GET(url) content <- httr::content(response, "raw") hash <- digest(content, algo="sha1", serialize=FALSE, raw=TRUE) hash_hex <- paste(sprintf("%02x", as.integer(hash)), collapse="") raw_bytes <- hex_to_raw(hash_hex) base32_encode(raw_bytes) } (process_url("https://reporter.nih.gov/services/Projects/ProjectInfo?projectId=8008517")) ## [1] "XCQMKFZVSWQ01EGKMMAPGG0QM0NED1DK"