如何在R中获取哈希码作为整数?

9
我想在R中实现哈希技巧。
以下是代码:
library(digest)
a<-digest("key_a", algo='xxhash32')
#[1] "4da5b0f8"

这返回的是字符类型的哈希码。有没有办法将它转换为整数?或者有其他包可以实现这个功能吗?

3个回答

11

这个输出是一个十六进制字符串。使用下面的函数将其转换为十进制。该函数来自另一个论坛帖子,但链接已经失效(2017年)。

hex_to_int = function(h) {
  xx = strsplit(tolower(h), "")[[1L]]
  pos = match(xx, c(0L:9L, letters[1L:6L]))
  sum((pos - 1L) * 16^(rev(seq_along(xx) - 1)))
}

输出

> hex_to_int(a)
[1] 1302704376

但更好的答案是strtoi:就像@Andrie所说和@Gedrox回答的那样,base::strtoi函数的工作方式相同。

strtoi("4da5b0f8", 16)
[1] 1302704376

1
非常好,但请注意R语言有一个内置函数可以完成这个任务,叫做strtoi,正如其他答案所建议的那样。 - Andrie
1
不错,但是你如何避免整数溢出? - Simon Woodward
1
stringr::str_sub(a, end=-2) 会移除 a 的最后一个字符,以确保其适合于32位整数。 - Simon Woodward
1
但如何将此哈希(sha256结果)转换为strtoi(): "494414ded24da13c451b13b424928821351c78fce49f93d9e1b55f102790c206"? - cineS.
这个数字比.Machine $integer.max大。strtoi无法处理它。hex_to_int也会给您近似的double值。您需要编写自定义代码以获取精确的字符串表示。 - Atilla Ozgur

9
自从版本0.6.19开始,digest新增了一个digest2int函数,尽管没有算法选择。所使用的算法是Jenkin's one_at_a_time。
digest::digest2int("key_a")
#> [1] 1414969953

4

有一个内置的函数base::strtoi

> strtoi("4da5b0f8", 16)
[1] 1302704376

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接