網上的一篇文章中中提到:PHP 的 uniqid() 函數是將當前微妙乘以一個較大的數(1048576)後再轉為十六進位的,有兩點我不明白:
1.為什麼要乘以一個固定的數在轉換成十六進位,直接轉不行嗎?
2.為什麼要轉為16進位,十進位不行嗎?
望賜教,謝謝!
回複內容:
網上的一篇文章中中提到:PHP 的 uniqid() 函數是將當前微妙乘以一個較大的數(1048576)後再轉為十六進位的,有兩點我不明白:
1.為什麼要乘以一個固定的數在轉換成十六進位,直接轉不行嗎?
2.為什麼要轉為16進位,十進位不行嗎?
望賜教,謝謝!
首先不是乘,是取餘數
https://github.com/php/php-src/blob/php-7.0.0/ext/standard/uniqid.c#L72-L78
gettimeofday((struct timeval *) &tv, (struct timezone *) NULL); sec = (int) tv.tv_sec; usec = (int) (tv.tv_usec % 0x100000); /* The max value usec can have is 0xF423F, so we use only five hex * digits for usecs. */
這段代碼說的還是很清楚的,首先拿系統時間的秒部分和微秒部分,因為微秒部分最大值是0xF423F
(999999),所以截取末五位用於uniqid的結果, % 0x100000
就是在截取末五位(十六進位), 0x100000
寫成十進位就是1048576
至於為什麼十六進位,十六進位位元少,計算速度快。uniqid的結果不是給人閱讀的,這裡用十進位並沒有什麼顯著的優點。
把微秒資訊儲存下來。
16進位可能是為了位操作,也可能是為了省空間,不過省空間完全可以用36進位。
其實應該轉換為的是二進位,因為二進位最為貼近電腦的底層,0為斷電,1為通電,轉換為16進位只是為了方便閱讀啊,因為轉為二進位是很長的一段