代码之家  ›  专栏  ›  技术社区  ›  Metalshark

CDN分发的PHP算法[关闭]

  •  1
  • Metalshark  · 技术社区  · 16 年前

    我包含的CSS文件拉入了其他文件中,因此关联*facepalm*


    我们有下面的代码来选择每个文件名的CNAME CDN引用。它每次必须基于给定的文件名返回相同的URL。我们认为这是足够随机的:

    <?php
    
      function cdn_prefix($fileName) {
        $number_of_servers = 4;
    
        $md5 = md5($fileName);
    
        $md5 = substr($md5, 0, 4);
    
        $hash_number = base_convert($md5, 16, 10);
    
        $server_number = ($hash_number % $number_of_servers) + 1;
    
        $server_prefix = '//static' . $server_number . '.' . $_SERVER['SERVER_NAME'];
    
        return $server_prefix . $fileName;
      }
    
    ?>
    

    然而,它似乎倾向于数字3: MD5

    不管我做什么(salt、不同的基、随机乘法等),headerBg到mainNavPipe的结果(在屏幕截图上)都有相同的数字。

    有更好的算法吗?

    下面是使用SHA1的相同算法得到的结果 SHA1

    阵列(用于测试)是:

    FILES = [
        '/a/files/image/250.jpg',
        '/a/files/image/244.jpg',
        '/a/files/image/247.jpg',
        '/a/css/global/core.css',
        '/a/css/global/print.css',
        '/a/img/global/new_logo.gif',
        '/a/img/global/book-a-free-survey.gif',
        '/a/img/global/make_an_enquiry.gif',
        '/a/img/global/purchase-locks-blue.jpg',
        '/a/files/image/251.jpg',
        '/a/img/global/bg.gif',
        '/a/img/global/headerBg.jpg',
        '/a/img/global/basketBg.gif',
        '/a/img/global/arrow.png',
        '/a/img/global/trolley.gif',
        '/a/img/global/mainNavBg.gif',
        '/a/img/global/mainNavCurrentBg.gif',
        '/a/img/global/mainNavPipe.gif',
        '/a/img/common/sectionNavBg.jpg',
        '/a/img/global/nav_arrow.gif',
        '/a/img/global/footerBg.jpg',
        '/a/img/global/footerCopyrightBg.jpg',
        '/a/img/global/footerLogo.jpg'
    ]
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Artefacto    16 年前

    function cdn_prefix($fileName) {
        $number_of_servers = 4;
        $md5 = md5($fileName);
        $md5 = substr($md5, 0, 4);
        $hash_number = base_convert($md5, 16, 10);
        $server_number = ($hash_number % $number_of_servers) + 1;
        return $server_number;
    }
    $arr = array(1=>0, 2=>0, 3=>0, 4=>0,);
    for ($i = 1; $i < 200000; $i++) {
        $arr[cdn_prefix("anrg".$i)]++;
    }
    print_r($arr);
    

    给予:

    Array
    (
        [1] => 49770
        [2] => 50090
        [3] => 50026
        [4] => 50113
    )
    
    推荐文章