15

我经常对人类参与者进行研究。由于各种原因,我的初步标识符有时是降低数据匿名性的信息的组合(例如,我可能会连接一个字符串,其中包括完成日期和时间、IP 地址以及参与者提供的一些信息)。

因此,如果要以某种形式共享数据,则需要从初始 ID 创建一个经过清理的 ID。清理后的 ID 需要去除此类信息。R 中的一个简单方法就是分配连续的数字(例如, data.frame 在df$id <- seq(nrow(df))哪里df)。但是,如果在研究的初始阶段收集更多数据或重新使用行,这可能会导致问题。即,每次更新原始数据集时,分配给给定参与者的清理后的 ID 可能会有所不同。这反过来可能会破坏对已清理数据集的后续分析,例如,可能已根据已清理 ID 过滤了案例。

因此,我考虑使用packagedigest中的函数digest创建哈希。

df$id <- sapply(df$raw_id, digest)

这似乎会导致一种从原始标识符到已清理标识符的可靠方法,但对于仅拥有已清理标识符的任何人来说,获取原始标识符是不可能的。

但是,鉴于我对digest函数和散列一般都是新手,我想问:

  • 是否digest适合剥离识别信息的 ID?
  • digest用于此目的是否有任何问题?
4

1 回答 1

13

我从上面的评论中学到了很多有用的东西。这个答案旨在提炼这些评论。

出于匿名研究参与者标识符的目的,散列存在两个问题:

  • 重复 ID:这似乎只是一个理论上的问题,而不是一个实际问题(尤其是如果您使用 sha1)。但我很高兴得到纠正。
  • 缺乏匿名性:如果您知道散列算法,并且您知道 id 格式并且您知道构成 id 的确切信息,那么您将能够确定哪个参与者与该信息匹配。在许多不共享格式、不知道参与者信息或 ID 使用几乎不知道的信息的情况下,这真的不是问题。尽管如此,向 ID 添加一些密码文本似乎是防止此问题成为问题的简单解决方案。

因此,总结一下我收集的建议。

library(digest)
hashed_id <- function(x, salt) {
    y <- paste(x, salt)
    y <- sapply(y, function(X) digest(X, algo="sha1"))
    as.character(y)
}

mydata$id <- hashed_id(mydata$raw_id, "somesalt1234")
于 2013-04-08T06:53:13.650 回答