> 백엔드 개발 > PHP 튜토리얼 > PHP에서 업로드된 이미지의 이름을 바꾸는 6가지 방법

PHP에서 업로드된 이미지의 이름을 바꾸는 6가지 방법

WBOY
풀어 주다: 2016-07-25 08:55:36
원래의
1862명이 탐색했습니다.
  1. /*
  2. com_create_guid()는 php5 버전에서 지원되는 함수입니다.
  3. */
  4. function guid(){
  5. if (function_exists('com_create_guid')){
  6. return com_create_guid();
  7. }else{
  8. mt_srand((double)microtime() * 10000);//php 4.2.0 이상에서는 선택 사항.
  9. echo(mt_rand());
  10. $charid = strtoupper(md5(uniqid(rand(), true)));
  11. $ 하이픈 = chr(45);// "-"
  12. $uuid = chr(123)// "{"
  13. .substr($charid, 0, 8).$hyphen
  14. .substr($ charid , 8, 4).$hyphen
  15. .substr($charid,12, 4).$hyphen
  16. .substr($charid,16, 4).$hyphen
  17. .substr($charid, 20 ,12)
  18. .chr(125);// "}"
  19. return $uuid;
  20. }
  21. }
코드 복사

2, MD5: guid와 마찬가지로 32자의 16진수 숫자가 출력됩니다. 차이점은 guid가 무작위로 생성되고, md5는 입력 데이터를 기반으로 생성되어야 한다는 것입니다. 예:

  1. $str = "안녕하세요";
  2. echo md5($str);
  3. ?>
코드 복사

출력 결과: 8b1a9953c4611296a827abf8c47804d7 장점: 입력된 시드 데이터를 기반으로 출력 값을 제어할 수 있습니다. 시드 데이터가 규칙적이고 반복되지 않는 경우 md5를 통해 데이터를 보호할 수 있으므로 큰 혼란이 발생합니다. 단점: 32비트 문자는 너무 길며 고유한 시드 데이터를 제공해야 합니다. 사용법: 높은 동시성, 초를 시드 데이터로 사용하면 중복이 계속 발생합니다. 예:

  1. /*
  2. * time() 함수와 함께 사용되며 1970년부터 1970년까지의 초 수를 사용합니다. 현재 시간을 시드 번호로 .
  3. */
  4. $str=time();
  5. echo md5($str);
  6. ?>
코드 복사

3, uniqid(): 13자리 또는 23자리 문자열을 반환합니다. 우리의 목적에 따라 uniqid()는 md5()의 향상된 버전과 같습니다. 특히 차등 식별자를 문자열 접두사로 사용할 수 있어 반복되는 이름 지정 가능성을 줄일 수 있기 때문입니다. 동시성이 높지 않은 극단적인 상황에서는 이미 일반적인 요구 사항을 충족할 수 있는 이 기능을 사용하는 것이 좋습니다.

정의: uniqid() 함수는 현재 시간(마이크로초)을 기준으로 고유 ID를 생성합니다. 사용법: uniqid(prefix,more_entropy) 참고: prefix는 출력 문자열에 접두사를 추가할 수 있습니다. more_entropy 매개변수가 true인 경우 23비트 문자열이 출력됩니다.

예:

  1. var_dump(uniqid());
  2. var_dump(uniqid("a"));
  3. ?> ;
코드 복사

출력 결과: 문자열(13) "51734aa562254" 문자열(14) "a51734aa562257" 장점: 13자리 문자열 길이는 허용되는 파일 이름 지정 길이입니다. 접두사를 추가할 수 있으며 결과에 데이터 난독화가 포함되어 원본 데이터를 역참조하는 것을 방지할 수 있습니다. 단점: md5와 유사하고 동시성이 높으며 초를 시드 데이터로 사용하지만 중복이 계속 발생합니다.

3. 업그레이드 버전 계획: 1. fast_uuid: 17자리를 반환합니다. uniqid()의 불완전하게 사용자 정의된 버전과 마찬가지로 이 함수에 나타나는 "시드 번호 시작 시간" 개념은 매우 계몽적입니다. time() 및 uniqid()에 사용되는 기본 시간은 1970년부터 계산되며 길이는 10자리(1366512439)입니다. "시드 번호 시작 시간"을 사용하면 이 값을 줄일 수 있습니다. 왜냐하면, 실제 수요 관점에서 보면 자동적으로 성장할 수 있는 가치일 뿐이기 때문입니다. 시작 시간을 맞춤화한 후에는 길이를 줄이는 것 외에도 혼란을 야기하는 역할도 할 수 있습니다.

예:

  1. /*

  2. * 매개변수 suffix_len은 문자열에 추가되는 임의의 숫자 수를 지정합니다. 생성된 ID 값, 기본값은 3입니다.
  3. * 알고리즘을 제공해 주신 "Ivan Tan| Tan Junqing DrinChing (at) Gmail.com"에게 감사드립니다.
  4. * @param int suffix_len
  5. * @return string
  6. */
  7. function fast_uuid($suffix_len=3){
  8. // 시드 번호 계산 시작 시간
  9. $being_timestamp = strtotime('2013-3-21');

  10. $time = 폭발(' ', microtime());

  11. $id = ($time[1] - $ being_timestamp) . sprintf(' u', substr($time[0], 2, 6));
  12. if ($suffix_len > 0)
  13. {
  14. $id .= substr(sprintf( ' 0u', mt_rand()), 0, $suffix_len);
  15. }
  16. return $id;
  17. }

코드 복사

출력 결과: 29832412631099013

2, time() 임의의 숫자: 위의 예에서는 1초에 발생하는 여러 요청을 해결하기 위해 난수를 사용하는 방법이 나타났습니다. 두 가지 기능이 제공됩니다:

  1. function Random ($ length) { $ hash = '';
  2. $ chars = 'abcdefghijklmnopqrstuvwxyz0123456789Abcdefwghghijklmnopqrstuvyz. ;
  3. $max = strlen($chars) - 1;
  4. PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
  5. for($i = 0; $ i < $length; $i ) {
  6. $hash .= $chars[mt_rand(0, $max)];
  7. } // bbs.it-home.org
  8. return $hash;
  9. }
  10. function random2($length, $numeric = 0) {
  11. PHP_VERSION < '4.2.0' ? mt_srand((double)microtime() * 1000000) : mt_srand();
  12. $ seed = base_convert(md5(print_r($_SERVER, 1).microtime()), 16, $numeric ? 10 : 35);
  13. $seed = $numeric ? (str_replace('0', '', $seed ).'012340567890') : ($seed.'zZ'.strtoupper($seed));
  14. $hash = '';
  15. $max = strlen($seed) - 1;
  16. for( $i = 0; $i < $length; $i ) {
  17. $hash .= $seed[mt_rand(0, $max)];
  18. }
  19. $hash 반환;
  20. }
  21. ?>
코드 복사

4. 최종 계획: 아이디어: 사용자 ID 초의 난수. 그 중 "userid 초"는 10진수에서 64자리로 변환되어 자릿수가 줄어듭니다. 설명하다: userid: 16진수에서 "ZZZZ"의 최대값은 "16777215"와 같은 10진수로 변환되고, 10진수로 변환된 "ZZZ"의 최대값은 "262143"과 같습니다. 초: 자신만의 시간 시작 지점을 설정하세요. * /

함수 hex64to10($m, $len = 0) {
$m = (string)$m;
$hex2 = '';
    $Code = KeyCode;
  1. for( $i = 0, $l = strlen($Code); $i < $l; $i ) {
  2. $KeyCode[] = $Code[$i];
  3. }
  4. $KeyCode = array_flip($KeyCode);

  5. for($i = 0, $l = strlen($m); $i < $l; $i ) {

  6. $one = $m[$i];
  7. $hex2 .= str_pad(decbin($KeyCode[$one]), 6, '0', STR_PAD_LEFT);
  8. }
  9. $return = bindec($hex2 );

  10. if($len) {

  11. $clen = strlen($return);
  12. if($clen >= $len) {
  13. return $return;
  14. }
  15. else {
  16. return str_pad($return, $len, '0', STR_PAD_LEFT);
  17. }
  18. }
  19. return $return;
  20. }
  21. /**

  22. * 64자리 문자열을 10진수 문자열로 변환
  23. * @param $m string 64자리 문자열
  24. * @param $len 정수 길이가 충분하지 않은 경우 문자열의 길이를 반환하고, 0으로 채우면 0은 패딩이 없음을 의미합니다
  25. * @return string
  26. * @author 野马
  27. */
  28. 함수 hex10to64($m, $len = 0) {
  29. $KeyCode = KeyCode;
  30. $hex2 = decbin ($m);
  31. $hex2 = str_rsplit($hex2, 6);
  32. $hex64 = array();
  33. foreach($hex2를 $one으로) {
  34. $t = bindec($ one);
  35. $hex64[] = $KeyCode[$t];
  36. }
  37. $return = preg_replace('/^0*/', '', implode('', $hex64)) ;
  38. if($len) {
  39. $clen = strlen($return);
  40. if($clen >= $len) {
  41. return $return;
  42. }
  43. else {
  44. return str_pad($return, $len, '0', STR_PAD_LEFT);
  45. }
  46. }
  47. return $return;
  48. }

  49. < p> /**
  50. * 10진수 문자열을 64자리 숫자 문자열로 변환
  51. * @param $m string 10진수 문자열
  52. * @param $len 정수 문자열 길이를 반환하고, 길이가 충분하지 않으면 채우기 0, 0은 패딩이 없음을 의미합니다
  53. * @return string
  54. * @author 野马
  55. */
  56. function hex16to64($m, $len = 0) {
  57. $KeyCode = KeyCode;
  58. $hex2 = array();
  59. for($i = 0, $j = strlen($m); $i < $j; $i) {
  60. $hex2[] = str_pad(base_convert($m[$i], 16, 2), ' 0', STR_PAD_LEFT);
  61. }
  62. $hex2 = implode('', $hex2);
  63. $hex2 = str_rsplit($hex2, 6);
  64. foreach($hex2를 $one으로) {
  65. $hex64[] = $KeyCode[bindec($one)];
  66. }
  67. $return = preg_replace('/^0*/', '', implode('', $hex64) );
  68. if($len) {
  69. $clen = strlen($return);
  70. if($clen >= $len) {
  71. return $return;
  72. }
  73. else {
  74. return str_pad($return, $len, '0', STR_PAD_LEFT);
  75. }
  76. }
  77. return $return;
  78. }

  79. < ;p> /**
  80. * 16진수 문자열을 16진수 문자열로 변환
  81. * @param $m string 16진수 문자열
  82. * @param $len 정수 문자열 길이를 반환하고, 길이가 부족하면 0으로 채우고, 0은 패딩이 없음을 의미합니다
  83. * @return string
  84. * @author 野马
  85. */
  86. 함수 str_rsplit($str, $len = 1) {
  87. if($str == null || $str == false || $str == ' ') return false;
  88. $strlen = strlen($str);
  89. if($strlen <= $len) return array($str);
  90. $headlen = $strlen % $len;
  91. if($headlen == 0) {
  92. return str_split($str, $len);
  93. }
  94. $return = array(substr($str, 0, $headlen));
  95. return array_merge($return, str_split(substr($str, $headlen), $len));
  96. }

  97. $a=idate("U");

  98. echo "rn
    e:" . hex10to64($a);
  99. echo "rn
    e:" . hex64to10(hex10to64($a));

    🎜>
  100. 코드 복사
  101. 규칙2:

    1. function dec2s4($dec) {
    2. $base = '0123456789_$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU VWXYZ' ;
    3. $result = '';

    4. {

    5. $result = $base[$dec % 64] 를 수행하세요. $result;
    6. $dec = intval($dec / 64);
    7. } while ($dec != 0);

    8. return $result;

    9. }

    10. function s42dec($sixty_four) {

    11. $base_map = array ( '0' => 0, '1' => 1 , '2' => 2, '3' => 4, '6' => 6, ' 8' => 8, '9' => 10, '$' => 12, 'b' => => 14, 'd' => 16, 'f' => 18, 'i' => ; 20, 'j' => 22, 'm' => 25, 'o' => , 'p' => 27, 'r' => 29, 't' => 31, ' v' => 33, 'w' => 35, 'y' => 37, 'A' => 38 => 39, 'C' => 40, 'E' => 43, 'G' => ;45, 'I' => 46, 'K' => 49, 'M' => 51 , 'O' => 52, 'P' => 53, 'Q' => 54, 'R' => 55, '에스' => 56, '티' => 57, '유' => 58, '뷔' => 59, 'W' => 60, '엑스' => 61, 'Y' => 62, 'Z' => 63, );
    12. $result = 0;
    13. $len = strlen($sixty_four);

    14. for ($n = 0; $n < $len; $n ) {

    15. $result *= 64;
    16. $result = $base_map[$sixty_four{$n}];
    17. }< /p>
    18. return $result;

    19. }

    20. $a=idate("U");

    21. var_dump(dec2s4($a));
    22. var_dump(s42dec(dec2s4) ($a)));

    复代码

    算法效率测试:

    1. $strarr = array();

    2. $time1 = microtime(true);
    3. for($i = 0; $i < 10000; $i) {
    4. $str = idate("U") $i;
    5. $strarr[] = "{$i}->$strrn
      " ;
    6. }
    7. $time2 = 마이크로타임(true);
    8. $time3 = $time2 - $time1;

    9. $time1 = 마이크로타임(true);

    10. for($i = 0; $i < 10000; $i) {
    11. $str = dec2s4(idate("U") $i);
    12. $ strarr[] = "{$i}->$strrn
      ";
    13. }
    14. $time2 = microtime(true);
    15. echo "rn
      运行10000次用时(秒):" . ($time2 - $time1 - $time3);

    复代码

    测试结果: 규정1:0.1687250137329 규정2:0.044965028762817 结论:算法1虽然效率上差一些,但是可以把md5生成 16进可可以把md5生成 16进须字符串.

    六、总结 本文内容의 关键点是使用10进转换为64进睥进行字符串的缩减. 例如,使用fast_uuid生成的17位数字,转换为64进符仅有7位字符;

    여기에는 PHP 상이 포함되어 있습니다.

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿