二進制定義:
二進制安全是指,在傳輸數據時,保證二進制數據的信息安全,也就是不被篡改、破譯等,如果被攻擊,能夠及時檢測出來。
二進制安全包含了密碼學的一些東西,比如加解密、簽名等。
c中的strlen函數就不算是binary safe的,因為它依賴於特殊的字符'\0'來判斷字符串是否結束,所以對於字符串str = "1234\0123"來說,
strlen(str)=4
而在php中,strlen函數是binary safe的,因為它不會對任何字符(包括'\0')進行特殊解釋,所以在php中,
strlen(str)=8
redis中SDS的實現保證了redis保存的數據是二進制安全的.
C字符串中的字符必須符合某種編碼(比如ASCII),並且除了字符串的末尾之外,字符串里面不能包含空字符,否則最先被程序讀入的空字符將被誤認為是字符串結尾,
這些限制使得C字符串只能保存文本數據,而不能保存像圖片、音頻、視頻、壓縮文件這樣的二進制數據。
它並不像C語言那樣,使用'\0'作為判定一個字符串的結尾,而是使用了獨立的len,這樣可以保證即使存
儲的數據中有'\0'這樣的字符,它也是可以支持讀取的
struct sdshdr {
int len;
int free;
char buf[];
};
因為有了對字符串長度定義len, 所以在處理字符串時候不會以零值字節(\0)為字符串結尾標志.
二進制安全就是輸入任何字節都能正確處理, 即使包含零值字節
redis內部保存的字符串數據結構是自己實現的,並不是沿用c語言的字符串數據結構。c語言的字符串默認是以'\0'結尾的,也就是說你保存的字符串內存在'\0',c語言自會識別前面的數據,后面的就會被忽略掉,所以說是不安全的。而redis內部雖然也是以'\0'標示一個字符串的結束,但是該字符串的指針內還保存了len和free兩個屬性,len表示該字符串的實際內容所占長度,free表示分配給該字符串的全部空間-字符串實際內容長度,也就是free表示該字符串的空閑空間長度,所以你對該字符串取值時是通過len屬性判斷實際內容的長度,然后取的值。拼接字符串時是追加到free空間內中的。所以redis對字符串的求長度和更新內容等操作比c語言要快很多,因為求長度只需要返回該字符串的len屬性值,c語言想要遍歷整個字符串才會知道長度。拼接字符串“一般”也不需要在重新分配空間,拼接的字符串直接放在free內存中就可以了。
struct sdshdr {
int len;//記錄buf數組大小
int free;//記錄buf數組還有多少可用空間
char buf[];//字符串實體,保存字符串的內容
};
- 因為有了對字符串長度定義len, 所以在處理字符串時候不會以零值字節(\0)為字符串結尾標志.
- 二進制安全就是輸入任何字節都能正確處理, 即使包含零值字節