Key-Derivation
通過使用 64 位隨機數來選擇數組索引的有效方法?
說,我有
uint64_t rand = <some random number>
和char array[20] = ...
。我的目標是array
根據rand
.
- 一種緩慢的方法是使用餘數:
size_t i = rand % 20
然後通過array[i]
.- 另一種我認為更快的方法是
i = rand/UINT64_MAX * 20
. 或者,為了避免需要浮動操作,它的逆計數器部分20/(UINT64_MAX/rand)
。- 第三種方法是使用隨機位像樹一樣分支到索引(但錯過了每 5 個數字):
size_t total_bytes = 20; size_t mask = 1; size_t i = 0; while (total_bytes) { if (rand & mask) i += total_bytes / 2; // branch right else i += 0; // branch left mask <<= 1; total_bytes /= 2; }
普通硬體有沒有更快的方法?例如筆記型電腦/台式電腦?
我關心的原因:我正在實現一個記憶體硬密鑰派生函式,並且在某些時候我需要根據計算出的密文的內容來選擇一個數組元素。隨機數為 64 位。
目標語言是 C。
只需執行 % 20
根據http://ithare.com/infographics-operation-costs-in-cpu-clock-cycles/ 整數除法在現代 CPU 上不需要 12-44 個 cpu 週期(在某些情況下,如果 ALU沒有做任何其他事情)考慮到您想要做的下一件事是記憶體訪問,充其量將是 L1 讀取本身將花費 3-4 個週期,並且可能您想用這個值做一些事情。
即使可以減少一兩個時鐘滴答聲,我也無法想像值得優化的場景。
在優化之前尋找瓶頸。