为什么这些 SHA1 实现不一样?
Why aren't these SHA1 implementations alike?
我的问题很简单 -- 使用 2 个单独的 SHA1 实现,我是否保证对相同的输入获得相同的输出,或者在实现中是否有 space 用于解释?
最具体地说,我的 R 摘要 SHA1 实现和我的 PHP Sha1 摘要似乎没有像我希望的那样组合在一起。是我有错误还是 SHA1 实现只是给出了同一消息的不同有效哈希值?
在 R 中:
digest_token = "Whosebug 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= "Whosebug is Cool";
$value = sha1($disgest_token, false);
输出
ef48c200b5d9b844c950f7704e6c03359f8a4e2f
我可能希望这两个产生相同的输出,但它们没有。
是的,这正是拥有哈希函数的意义所在。如果每个人都可以实现相同的算法并得到不同的结果,这个散列会有多大用处?
该算法会初始化一些变量,然后进行大量预定义的确定性操作 'bit shuffling'。虽然理论上你仍然可以通过更改这个初始化变量来拥有 SHA1 逻辑,但没有人这样做。
你可以看到这些variables here(这只是我能够找到的算法实现之一)。
digest[0] = 0x67452301;
digest[1] = 0xefcdab89;
digest[2] = 0x98badcfe;
digest[3] = 0x10325476;
digest[4] = 0xc3d2e1f0;
R digest package description 非常清楚发生了什么(强调我的):
The
digest
function applies a cryptographical hash function to arbitrary R objects. By default, the
objects are internally serialized, and either one of the currently implemented MD5 and SHA-1 hash
functions algorithms can be used to compute a compact digest of the serialized object.
In order to compare this implementation with others, serialization of the input argument can also be
turned off in which the input argument must be a character string for which its digest is returned.
以下代码产生与 PHP 代码相同的结果:
digest_token = "Whosebug is Cool"
value = digest(digest_token, "sha1", raw=FALSE, serialize=FALSE)
我的问题很简单 -- 使用 2 个单独的 SHA1 实现,我是否保证对相同的输入获得相同的输出,或者在实现中是否有 space 用于解释?
最具体地说,我的 R 摘要 SHA1 实现和我的 PHP Sha1 摘要似乎没有像我希望的那样组合在一起。是我有错误还是 SHA1 实现只是给出了同一消息的不同有效哈希值?
在 R 中:
digest_token = "Whosebug 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= "Whosebug is Cool";
$value = sha1($disgest_token, false);
输出
ef48c200b5d9b844c950f7704e6c03359f8a4e2f
我可能希望这两个产生相同的输出,但它们没有。
是的,这正是拥有哈希函数的意义所在。如果每个人都可以实现相同的算法并得到不同的结果,这个散列会有多大用处?
该算法会初始化一些变量,然后进行大量预定义的确定性操作 'bit shuffling'。虽然理论上你仍然可以通过更改这个初始化变量来拥有 SHA1 逻辑,但没有人这样做。
你可以看到这些variables here(这只是我能够找到的算法实现之一)。
digest[0] = 0x67452301;
digest[1] = 0xefcdab89;
digest[2] = 0x98badcfe;
digest[3] = 0x10325476;
digest[4] = 0xc3d2e1f0;
R digest package description 非常清楚发生了什么(强调我的):
The
digest
function applies a cryptographical hash function to arbitrary R objects. By default, the objects are internally serialized, and either one of the currently implemented MD5 and SHA-1 hash functions algorithms can be used to compute a compact digest of the serialized object.In order to compare this implementation with others, serialization of the input argument can also be turned off in which the input argument must be a character string for which its digest is returned.
以下代码产生与 PHP 代码相同的结果:
digest_token = "Whosebug is Cool"
value = digest(digest_token, "sha1", raw=FALSE, serialize=FALSE)