PHP 的 uniqid() 函數的兩點疑問?

來源:互聯網
上載者:User
網上的一篇文章中中提到: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進位只是為了方便閱讀啊,因為轉為二進位是很長的一段

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.