当前位置:Gxlcms > PHP教程 > PHP的sessionid是否会冲突

PHP的sessionid是否会冲突

时间:2021-07-01 10:21:17 帮助过:17人阅读

我不知道PHP的session id是基于哪种算法,但是不管什么算法,如果我有多台php web共享一个session池,那么php在生成这个session id的时候是不是有一定几率会产生冲突?因为这几台服务器都不知道对方生成了哪些id

回复内容:

我不知道PHP的session id是基于哪种算法,但是不管什么算法,如果我有多台php web共享一个session池,那么php在生成这个session id的时候是不是有一定几率会产生冲突?因为这几台服务器都不知道对方生成了哪些id

不会。

源码 https://raw.githubusercontent.com/php/php-src/master/ext/session/session.c

  • php_session_create_id 此函数负责生成 session id
PHPAPI zend_string *php_session_create_id(PS_CREATE_SID_ARGS) /* {{{ */
{
    // 散列算法 md5 sha1
    PHP_MD5_CTX md5_context;
    PHP_SHA1_CTX sha1_context;
#if defined(HAVE_HASH_EXT) && !defined(COMPILE_DL_HASH)
    void *hash_context = NULL;
#endif
    unsigned char *digest;
    int digest_len;
    char *buf;
    struct timeval tv;  // 时间
    zval *array;
    zval *token;    // 令牌 token
    zend_string *outid;
    char *remote_addr = NULL;    //看着熟悉,这个值就是$_SERVER['REMOTE_ADDR']的值

    gettimeofday(&tv, NULL);

    ......

    /* maximum 15+19+19+10 bytes */
    spprintf(
        &buf,         // 生成的 session_id
        0, 
        "%.15s%ld" ZEND_LONG_FMT "%0.8F", 
        remote_addr ? remote_addr : "", 
        tv.tv_sec,     // 时间
        (zend_long)tv.tv_usec, // 毫秒
        php_combined_lcg(TSRMLS_C) * 10    // 随机数
    );

    // 后面就是各种散列算法

所以我觉得,除非有非法攻击者,否则应该不会

但是,即使 MD5 SHA 算法,都可能冲突。如果服务器并发非常大,可以考虑自己实现一个 session 算法。

当然有可能,即使是一台都有可能。

理论上,也许会。实际上,不会。

人气教程排行