產生一個8位的隨機字串
function make_coupon_card() { $code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $rand = $code[rand(0,25)] .strtoupper(dechex(date('m'))) .date('d').substr(time(),-5) .substr(microtime(),2,5) .sprintf('%02d',rand(0,99)); for( $a = md5( $rand, true ), $s = '0123456789ABCDEFGHIJKLMNOPQRSTUV', $d = '', $f = 0; $f < 8; $g = ord( $a[ $f ] ), $d .= $s[ ( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F ], $f++ ); return $d; }
對於( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F 的按位異或 減去本身 再進行的與運算,最終的範圍是0-31之間,這個是如何確定的?
回複內容:
產生一個8位的隨機字串
function make_coupon_card() { $code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $rand = $code[rand(0,25)] .strtoupper(dechex(date('m'))) .date('d').substr(time(),-5) .substr(microtime(),2,5) .sprintf('%02d',rand(0,99)); for( $a = md5( $rand, true ), $s = '0123456789ABCDEFGHIJKLMNOPQRSTUV', $d = '', $f = 0; $f < 8; $g = ord( $a[ $f ] ), $d .= $s[ ( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F ], $f++ ); return $d; }
對於( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F 的按位異或 減去本身 再進行的與運算,最終的範圍是0-31之間,這個是如何確定的?
( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F
簡而言之有個關鍵點,運算子-
的優先順序要比&
高。
所以整體來看應該是( ( $g ^ ord( $a[ $f + 8 ] ) ) - $g )
和0x1F
進行與運算,
而0x1F
就是十進位的31
,取與的結果範圍就限定在了0 - 31
之間。