从字符串转换为字节时 md5 函数使用什么编码

what encoding does the md5 function use when converting from string to bytes

在php中调用md5方法并传递一个字符串作为参数时,我猜测php必须将字符串转换为字节才能执行哈希操作,什么从字符串转换为字节时使用编码吗?

我正在尝试将以下 php 代码移植到 .net 代码中。

.net 不能先对字符串进行 Hash,它必须转换为字节数组或流。

<?php
$params = $_GET;
$var = "";
foreach ($params as $key => $value)
{
    if($key != "hash")
    {
        $var .= $value;
    }
}
$genstamp = md5($var . "SecretMD5Key");
if($genstamp != $_GET["hash"])
{
    echo "Hash is not valid";
    exit();
}
else
{
    //Hash is OK    
}
?>

PHP 字符串不是 "encoded",它们更像是字节数组。程序员有责任确保代码没有做一些愚蠢的事情(比如连接 UTF-8 字符串和 ISO-8859 或使用 unicode 函数和非 unicode 字符串)。通常它会让事情变得困难,但至少你知道 md5 将要编码的内容:它完全取决于字符串的来源( 数据库驱动程序的设置,托管 $_REQUEST 值等形式的页面的编码等)。

md5函数定义在

它使用这个 Public 域实现:

PHP调用实现的代码就是这样:

/* {{{ proto string md5(string str, [ bool raw_output])
   Calculate the md5 hash of a string */
PHP_NAMED_FUNCTION(php_if_md5)
{
    zend_string *arg;
    zend_bool raw_output = 0;
    char md5str[33];
    PHP_MD5_CTX context;
    unsigned char digest[16];

    ZEND_PARSE_PARAMETERS_START(1, 2)
        Z_PARAM_STR(arg)
        Z_PARAM_OPTIONAL
        Z_PARAM_BOOL(raw_output)
    ZEND_PARSE_PARAMETERS_END();

    md5str[0] = '[=10=]';
    PHP_MD5Init(&context);
    PHP_MD5Update(&context, ZSTR_VAL(arg), ZSTR_LEN(arg));
    PHP_MD5Final(digest, &context);
    if (raw_output) {
        RETURN_STRINGL((char *) digest, 16);
    } else {
        make_digest_ex(md5str, digest, 16);
        RETVAL_STRING(md5str);
    }

}

如本页其他地方所述,不会有任何转化。它将使用您从 PHP 中输入的任何内容通过这些计算 MD5 哈希值:

PHPAPI void PHP_MD5Init(PHP_MD5_CTX *ctx);
PHPAPI void PHP_MD5Update(PHP_MD5_CTX *ctx, const void *data, size_t size);
PHPAPI void PHP_MD5Final(unsigned char *result, PHP_MD5_CTX *ctx);