原子(Atom)这一数据结构的工作原理基本类似于拉链式哈希表,每个原子对应唯一的字符串,不同的原子对应的字符串内容不同(用数学语言讲就是在原子和字符串之间建立了双射)。原子的特点有三个:
其一,每个原子对应的字符串是不可变的;
其二,相同内容的字符串只会保存一次,节省了存储空间;
其三,比较两个字符串是否相同时不必知道字符串的内容,而只需比较它们对应的指针。
而原子为什么有这三个特点,之后在代码中会详细解释。
首先看atom的定义:
static struct atom {
char *str;
int len;
struct atom *link;
} *buckets[2048];
因为使用者并不需要知道原子的定义,所以这部分是放在实现文件里的,但是为了便于理解提到了前面。每个原子对应唯一的字符串——str指向这个字符串,len记录这个字符串的长度,link是为了实现链表,然后做了一个数组buckets[2048],则是为了实现hash(相当于有2048个桶,每个桶存放一个原子链表)。当要查找一个特定字符串是否已经保存时,就是先用hash算法找到它对应的桶,然后顺着这个桶为首 的原子链表查找。