PHP的session id是否会冲突
阿神
阿神 2017-04-10 15:06:48
[PHP讨论组]

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

阿神
阿神

闭关修行中......

全部回复(3)
PHP中文网

不会。

源码 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 算法。

高洛峰

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

伊谢尔伦

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号