-
- /*
- com_create_guid() is a function supported by the php5 version. For unsupported versions, you can define it yourself;
- */
- function guid(){
- if (function_exists('com_create_guid ')){
- return com_create_guid();
- }else{
- mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
- echo(mt_rand());
- $charid = strtoupper(md5(uniqid(rand(), true)));
- $hyphen = chr(45);// "-"
- $uuid = chr(123)// "{"
- .substr($charid, 0 , 8).$hyphen
- .substr($charid, 8, 4).$hyphen
- .substr($charid,12, 4).$hyphen
- .substr($charid,16, 4).$hyphen
- . substr($charid,20,12)
- .chr(125);// "}"
- return $uuid;
- }
- }
Copy code 2, MD5:
Like guid, a 32-character hexadecimal number will be output. The difference is that guid is randomly generated, and md5 needs to be generated based on the input data.
example:
- $str = "Hello";
- echo md5($str);
- ?>
Copy code
Output result:
8b1a9953c4611296a827abf8c47804d7
Advantages: The output value can be controlled based on the input seed data. If the seed data is regular and non-repeating, the data can be protected through md5, which will cause great confusion.
Disadvantages: 32-bit characters are too long; unique seed data needs to be provided;
Usage: High concurrency, using seconds as the seed data, duplication will still occur.
example:
-
- /*
- * Used in combination with the time() function, using the number of seconds from 1970 to the current time as the seed number.
- */
- $str=time();
- echo md5($str);
- ?>
Copy code
3, uniqid(): return 13 or 23-digit string
For our purposes, uniqid() is like an improved version of md5(), especially since we can use differential identifiers as string prefixes, which can reduce the chance of repeated naming.
For extreme situations such as non-high concurrency, it is recommended to use this function, which can already meet general needs.
Definition: The uniqid() function generates a unique ID based on the current time in microseconds.
Usage: uniqid(prefix,more_entropy)
Note: prefix can add a prefix to the output string. The example is as follows. When the more_entropy parameter is true, a 23-bit string will be output.
Example:
-
- var_dump(uniqid());
- var_dump(uniqid("a"));
- ?>
Copy code
Output result:
string(13) "51734aa562254" string(14) "a51734aa562257"
Advantages: 13-digit string length is an acceptable file naming length; prefixes can be added, and the result contains data obfuscation, which can avoid back-referencing the original data.
Disadvantages: Similar to md5, high concurrency, using seconds as the seed data, duplication will still occur.
3. Upgraded version plan:
1. fast_uuid: returns 17 digits
A bit like an incompletely customized version of uniqid(), the concept of "seed number starting time" that appears in this function is very enlightening.
The default time used in time() and uniqid() is calculated from 1970, and the length is ten digits (1366512439). Using the "seed number starting time" can reduce this value.
Because, from the actual demand point of view, it is just a value that can grow automatically.
After the start time is customized, in addition to reducing the length, it can also play a role in confusion.
Example:
-
-
/* - * The parameter suffix_len specifies how many random digits are appended to the generated ID value. The default value is 3.
- * Thanks to "Ivan Tan| Tan Junqing DrinChing (at) Gmail.com" for providing the algorithm.
- * @param int suffix_len
- * @return string
- */
- function fast_uuid($suffix_len=3){
- //! The starting time for calculating the seed number
- $being_timestamp = strtotime('2013-3-21');< ;/p>
$time = explode(' ', microtime());
- $id = ($time[1] - $being_timestamp) . sprintf('%06u', substr($time[0 ], 2, 6));
- if ($suffix_len > 0)
- {
- $id .= substr(sprintf('%010u', mt_rand()), 0, $suffix_len);
- }
- return $id ;
- }
-
Copy code
Output result:
29832412631099013
2, time()+random number:
The use of random numbers has appeared in the above example to solve multiple requests that occur in one second.
Two functions are provided:
-
- function random($length) {
- $hash = '';
- $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
- $max = strlen($chars) - 1 ;
- PHP_VERSION < ' 4.2.0' && mt_srand((double)microtime() * 1000000);
- for($i = 0; $i < $length; $i++) {
- $hash .= $chars[mt_rand(0, $max )];
- } // bbs.it-home.org
- return $hash;
- }
- function random2($length, $numeric = 0) {
- PHP_VERSION < '4.2.0' ? mt_srand((double)microtime () * 1000000) : mt_srand();
- $seed = base_convert(md5(print_r($_SERVER, 1).microtime()), 16, $numeric ? 10 : 35);
- $seed = $numeric ? (str_replace ('0', '', $seed).'012340567890') : ($seed.'zZ'.strtoupper($seed));
- $hash = '';
- $max = strlen($seed) - 1 ;
- for($i = 0; $i < $length; $i++) {
- $hash .= $seed[mt_rand(0, $max)];
- }
- return $hash;
- }
- ?>
Copy code
4. Final plan:
Idea: userid+second+random number. Among them, "userid+second" is converted from decimal to 64, reducing the number of digits;
illustrate:
userid: The maximum value of "ZZZZ" in hexadecimal is converted to decimal equal to "16777215", and the maximum value of "ZZZ" converted to decimal is equal to "262143";
Seconds: Set your own time starting point.
-
-
- const KeyCode = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$';
- /**
- * Convert a 64-digit string to a decimal string
- * @param $m string 64-digit string
- * @param $len integer Returns the length of the string, if the length is not enough, use 0 Padding, 0 means no padding
- * @return string
- * @author 野马
- */
- function hex64to10 ($m, $len = 0) {
- $m = (string)$m;
- $hex2 = '';
- $Code = KeyCode;
- for($i = 0, $l = strlen($Code); $i < $l; $i++) {
- $KeyCode [] = $Code[$i];
- }
- $KeyCode = array_flip($KeyCode);
for($i = 0, $l = strlen($m); $i < $l; $i++) {
- $one = $m[$i];
- $hex2 .= str_pad(decbin($KeyCode[$one]), 6, '0', STR_PAD_LEFT);
- }
- $ return = bindec($hex2);
if($len) {
- $clen = strlen($return);
- if($clen >= $len) {
- return $return ;
- }
- else {
- return str_pad($return, $len, '0', STR_PAD_LEFT);
- }
- }
- return $return;
- }
/**
- * Convert the decimal number string to the 64-base number string
- * @param $m string The decimal number string
- * @param $len integer Returns the string length, if the length is not enough, use 0 Padding, 0 means no padding
- * @return string
- * @author 野马
- */
- function hex10to64($m, $len = 0) {
- $KeyCode = KeyCode;
- $hex2 = decbin($m);
- $hex2 = str_rsplit($hex2, 6);
- $hex64 = array() ;
- foreach($hex2 as $one) {
- $t = bindec($one);
- $hex64[] = $KeyCode[$t];
- }
- $return = preg_replace('/^0*/', '', implode('', $hex64));
- if($len) {
- $clen = strlen($return);
- if($clen >= $len) {
- return $return;
- }
- else {
- return str_pad($return, $len, '0', STR_PAD_LEFT);
- }
- }
- return $return;
- }
/**
- * Convert hexadecimal number string to hexadecimal number string
- * @param $m string Hexadecimal number string
- * @param $len integer Returns the string length, if the length is not enough, use 0 Padding, 0 means no padding
- * @return string
- * @author 野马
- */
- function hex16to64($m, $len = 0) {
- $KeyCode = KeyCode;
- $hex2 = array();
- for($i = 0, $j = strlen($m); $i < $j; + +$i) {
- $hex2[] = str_pad(base_convert($m[$i], 16, 2), 4, '0', STR_PAD_LEFT);
- }
- $hex2 = implode('', $hex2) ;
- $hex2 = str_rsplit($hex2, 6);
- foreach($hex2 as $one) {
- $hex64[] = $KeyCode[bindec($one)];
- }
- $return = preg_replace('/^ 0*/', '', implode('', $hex64));
- if($len) {
- $clen = strlen($return);
- if($clen >= $len) {
- return $ return;
- }
- else {
- return str_pad($return, $len, '0', STR_PAD_LEFT);
- }
- }
- return $return;
- }
/**
- * The function is close to the PHP native function str_split, except that the cutting starts from the end
- * @param $str string The string that needs to be cut
- * @param $len integer The length of each string
- * @return array
- * @author Mustang
- */
- function str_rsplit($str, $len = 1) {
- if($str == null || $str == false || $str == '') return false;
- $strlen = strlen($ str);
- if($strlen <= $len) return array($str);
- $headlen = $strlen % $len;
- if($headlen == 0) {
- return str_split($str, $len );
- }
- $return = array(substr($str, 0, $headlen));
- return array_merge($return, str_split(substr($str, $headlen), $len));
- } p>
$a=idate("U");
- echo "rn
e:" . hex10to64($a);
- echo "rn
e:" . hex64to10 (hex10to64($a));
-
Copy code
算法2:
-
-
- function dec2s4($dec) {
- $base = '0123456789_$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
- $result = '';
do {
- $result = $base[$dec % 64] . $result;
- $dec = intval($dec / 64);
- } while ($dec != 0);
return $result;
- }
function s42dec($sixty_four) {
- $base_map = array ( '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9, '_' => 10, '$' => 11, 'a' => 12, 'b' => 13, 'c' => 14, 'd' => 15, 'e' => 16, 'f' => 17, 'g' => 18, 'h' => 19, 'i' => 20, 'j' => 21, 'k' => 22, 'l' => 23, 'm' => 24, 'n' => 25, 'o' => 26, 'p' => 27, 'q' => 28, 'r' => 29, 's' => 30, 't' => 31, 'u' => 32, 'v' => 33, 'w' => 34, 'x' => 35, 'y' => 36, 'z' => 37, 'A' => 38, 'B' => 39, 'C' => 40, 'D' => 41, 'E' => 42, 'F' => 43, 'G' => 44, 'H' => 45, 'I' => 46, 'J' => 47, 'K' => 48, 'L' => 49, 'M' => 50, 'N' => 51, 'O' => 52, 'P' => 53, 'Q' => 54, 'R' => 55, 'S' => 56, 'T' => 57, 'U' => 58, 'V' => 59, 'W' => 60, 'X' => 61, 'Y' => 62, 'Z' => 63, );
- $result = 0;
- $len = strlen($sixty_four);
for ($n = 0; $n < $len; $n++) {
- $result *= 64;
- $result += $base_map[$sixty_four{$n}];
- }
return $result;
- }
$a=idate("U");
- var_dump(dec2s4($a));
- var_dump(s42dec(dec2s4($a)));
-
复制代码
算法效率测试:
-
-
$strarr = array();
- $time1 = microtime(true);
- for($i = 0; $i < 10000; ++$i) {
- $str = idate("U")+$i;
- $strarr[] = "{$i}->$strrn
";
- }
- $time2 = microtime(true);
- $time3 = $time2 - $time1;
$time1 = microtime(true);
- for($i = 0; $i < 10000; ++$i) {
- $str = dec2s4(idate("U")+$i);
- $strarr[] = "{$i}->$strrn
";
- }
- $time2 = microtime(true);
- echo "rn
运行10000次用时(秒):" . ($time2 - $time1 - $time3);
-
复制代码
测试结果:
算法1:0.1687250137329
算法2:0.044965028762817
结论:算法1虽然效率上差一些,但是可以把md5生成的16进制转化为64进制,能够使用在必须使用md5的环境下缩短字符串。
六、总结
本文内容的关键点是使用10进制转换为64进制来进行字符串的缩减。
例如,使用fast_uuid生成的17位数字,转换为64进制仅有7位字符;
以上就是有关php上传图片重命名的全部内容了,希望对大家有所帮助。
|