You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

相同的R数据框却有不同哈希值(非属性问题)

数据框identical()返回TRUE但digest()返回FALSE的排查过程

我有两个约150行的R数据框X和Y,identical(X, Y)返回TRUE,但identical(digest(X), digest(Y))返回FALSE,以下是排查过程:

属性一致性验证

已确认两个数据框的属性完全一致,测试结果如下:

> names(attributes(X))
[1] "names"     "row.names" "class"
> names(attributes(Y))
[1] "names"     "row.names" "class"  

> digest(X)
[1] "07b7ef11ce6eaae01ddd79e4facef581"
> digest(Y)
[1] "09d8abcab0af0a72265a9b690f4eacc3"

> digest(X[1:nrow(X),])
[1] "2f338de9972529bd2bc9c39c3c5762ea"
> digest(Y[1:nrow(Y),])
[1] "2f338de9972529bd2bc9c39c3c5762ea"

> identical(X, Y, attrib.as.set=FALSE)
[1] TRUE

RDS保存读取测试

将数据框保存为.RDS文件后重新读取,identical()仍返回TRUE,但digest()结果依旧不同:

> X_rds <- read_rds("cache_vars/X.rds")
> Y_rds <- read_rds("cache_vars/Y.rds")
> identical(X_rds , Y_rds )
[1] TRUE
> digest(X_rds)
[1] "07b7ef11ce6eaae01ddd79e4facef581"
> digest(Y_rds )
[1] "09d8abcab0af0a72265a9b690f4eacc3"
> identical(X_rds , Y_rds , attrib.as.set=FALSE)
[1] TRUE

矩阵转换测试

将数据框转为矩阵再转回数据框后,哈希值变得一致,说明差异源于结构层面:

> X_Mat <- as.matrix(X_rds)
> Y_Mat <- as.matrix(Y_rds)
> identical(digest(X_Mat), digest(Y_Mat))
[1] TRUE
> X_DF <- as.data.frame(X_Mat)
> Y_DF <- as.data.frame(Y_Mat)
> identical(digest(X_DF ), digest(Y_DF))
[1] TRUE

数据框生成背景

X由并行设计的循环生成(但使用了%do%标记,未实际并行),Y由顺序循环生成。


更新

MrFlick的判断正确,事实证明并行rbind函数的序列化过程添加了gp=0x20标记,与写入RDS时的情况类似。


内容的提问来源于stack exchange,提问作者b-dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:45:28