生日悖論是個相當有趣的問題,一年有 365 天,若每個人出生在任一天的機率相等,那某個人出生在某一天的機率為
所以若正確的列出算式的話則必須從下式求
相當複雜,可以用以下算式估算
計算
所以可以看出問題的癥結點在於我們總是刻意忽略微小數值帶來的變化,將這個問題套用到資訊安全的領域上(尤其是密碼學),可以發現不少利用此種弱點的攻擊,這被稱為 Birthday attack
其中一例是 hash function 的碰撞問題,以 SHA-256 為例,他會將任意大小的資料轉成 256-bit 大小的輸出,假設每個相異 hash 發生的機率相等,則我們可以預期每
#define container_of(ptr, type, member) \
__extension__({ \
const __typeof__(((type *) 0)->member) *__pmember = (ptr); \
(type *) ((char *) __pmember - offsetof(type, member)); \
})
function call 在 32/64 位元下的實作方式不盡相同,不過大致上會是下方的流程
相較於直接展開 define 並操作,可以發現在一次的 function call 中會發生多次記憶體存取讓整體執行效率下降。
linux 上的 link-list 結構和我們平常使用的稍有不同,若是由我定義可能會將資料和連結用的指標放在同一結構中,
struct list_node {
int data;
struct list_node *next;
struct list_node *prev;
}
但在 linux 上的做法是,在 linked-list 結構中不定義額外的資料或指標,將其模組化,等到要使用時再將其放入儲存該 data 的結構中,透過 macro container_of(ptr, type, member)
來還原到原結構的起始位置。
struct list_head {
struct list_head *next
struct list_head *prev;
};