我的问题很简单 - 使用2个单独的SHA1实现,我保证为同一输入获得相同的输出,或者在实现中是否有空间进行解释?
最具体的是我的R摘要SHA1实现和我的PHP Sha1摘要似乎没有像我想的那样聚集在一起。是我有错误还是SHA1实现只是给同一个消息的不同有效哈希值?
在R:
digest_token = "Stackoverflow is Cool"
value = digest(digest_token, "sha1", raw=FALSE)
输出:
[1] 4c 70 99 2f 81 b5 32 0d 77 aa 17 b6 da be 69 92 13 a0 44 9f
在PHP中
$digest_token= "Stackoverflow is Cool";
$value = sha1($disgest_token, false);
输出
ef48c200b5d9b844c950f7704e6c03359f8a4e2f
我可能希望这两个产生相同的输出,但它们没有。
答案 0 :(得分:4)
R digest package description非常清楚发生了什么(强调我的):
在
digest
函数将加密哈希函数应用于任意R对象。 默认情况下, 对象是内部序列化的,以及当前实现的MD5和SHA-1哈希之一 函数算法可用于计算序列化对象的紧凑摘要。为了将此实现与其他实现进行比较,输入参数的序列化也可以 关闭,其中input参数必须是返回其摘要的字符串。
以下代码产生与PHP代码相同的结果:
digest_token = "Stackoverflow is Cool"
value = digest(digest_token, "sha1", raw=FALSE, serialize=FALSE)
答案 1 :(得分:1)
是的,这正是具有哈希函数的关键。如果每个人都可以实现相同的算法并且具有不同的结果,那么这个哈希会有多大用处?
该算法初始化一些变量,然后执行大量预定义的确定性“位混洗”。虽然理论上你通过改变这个初始化变量仍然会有SHA1逻辑,但没有人这样做。
您可以看到这些variables here(这只是我能够找到的算法实现之一)。
digest[0] = 0x67452301;
digest[1] = 0xefcdab89;
digest[2] = 0x98badcfe;
digest[3] = 0x10325476;
digest[4] = 0xc3d2e1f0;