Base64 vs HexïŒæ žå¿çãªãã¬ãŒããªã
Base64ãšHexãšã³ã³ãŒãã£ã³ã°ã®éžæã¯äžã€ã®è³ªåã«åž°çããŸãïŒã³ã³ãã¯ãããå¿ èŠããå¯èªæ§ãå¿ èŠãïŒHexãšã³ã³ãŒãã£ã³ã°ã¯åãã€ãã2ã€ã®16鲿åïŒ00-FFïŒã«å€æããå ¥åãµã€ãºã®ã¡ããã©2åã®åºåãçã¿ãŸããBase64ã¯3ãã€ãããšã«4æåã«å€æããå ¥åãµã€ãºã®1.33åã®åºåãçã¿ãŸãã1MBã®ãã¡ã€ã«ã§ïŒHexã¯2MBãBase64ã¯1.33MBãBase64ã¯ãµã€ãºã§åã¡ãHexã¯ã·ã³ãã«ãã§åã¡ãŸãã
Hexã¯èªã¿ããããããã°ããããã§ããåãã€ããæ£ç¢ºã«2æåã«ãããã³ã°ãããã®ã§ãããŒã¿ããã€ãåäœã§èŠèŠçã«è§£æã§ããŸãã16鲿åå"48656c6c6f"ã¯æããã«5ãã€ãã§ãåãã¢ãASCIIããŒãã«ã§èª¿ã¹ãããŸãïŒ48=H, 65=e, 6c=l, 6c=l, 6f=oïŒãBase64ã®"SGVsbG8="ã¯ããã³ã³ãã¯ãã§ãããåã ã®ãã€ããç®èŠã§ç¢ºèªã§ããŸããââ6ãããã®ã°ã«ãŒãã³ã°ããã€ãå¢çããŸããããã§ãã
ã©ã¡ããããã¹ãã»ãŒããªãšã³ã³ãŒãã£ã³ã°ã§ãââä»»æã®ãã€ããªããŒã¿ãå°å·å¯èœãªASCIIæåã«å€æããŸããéãã¯æåã»ããïŒHexã¯16æåïŒ0-9, a-fïŒãBase64ã¯64æåïŒA-Z, a-z, 0-9, +, /ïŒã䜿ããŸããã·ã³ãã«ãããã®æåæ°ãå€ãã»ã©ã1æåãããã®æ å ±éãå€ããªããŸãããããBase64ãããã³ã³ãã¯ããªçç±ã§ãã10鲿°ã2鲿°ããçãã®ãšåãåçã§ãã
Hexãšã³ã³ãŒãã£ã³ã°ã䜿ãã¹ãå Žé¢
ããã·ã¥åºåïŒSHA-256ã¯32ãã€ããçæããŸããHexã§ã¯64æåïŒ"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"ããã¹ãŠã®ããã·ã¥ããŒã«ããã¹ãŠã®ããã¥ã¡ã³ãããã¹ãŠã®APIãããã·ã¥å€ã«Hexã䜿ããŸããæ®éçãªæ £äŸã§ããhash-generatorããŒã«ã¯ããã©ã«ãã§HexãåºåããŸããéçºè ãèŠãŠæ¯èŒããããšãæåŸ ãããã©ãŒãããã ããã§ãã
ãã€ããªãããã³ã«ã®ãããã°ïŒãããã¯ãŒã¯ãã±ããããã¡ã€ã«ããããŒãã¡ã¢ãªãã³ããèŠããšããHexãæšæºçãªè¡šçŸã§ããWiresharkã¯Hexã衚瀺ããŸãããã€ããªãšãã£ã¿ã¯Hexã衚瀺ããŸããPNGãã¡ã€ã«ã®æåã®ãã€ãã¯"89504e47"ââãããã®ããžãã¯ãã³ããŒãèŠããããŸããBase64ã§ã¯åããã€ãã"iVBORw=="ã«ãªããèªèãã«ããããã¥ã¡ã³ãã§æ€çŽ¢ãã«ããã§ãã
ã«ã©ãŒã³ãŒãïŒCSSã«ã©ãŒïŒ#FF6B35ïŒãMACã¢ãã¬ã¹ïŒ00:1A:2B:3C:4D:5EïŒãUUIDïŒ550e8400-e29b-41d4-a716-446655440000ïŒã¯ãã¹ãŠHexã䜿ããŸããåã³ã³ããŒãã³ãããã€ãã«ãããã«ãããã³ã°ãããããã§ããã«ã©ãŒã¯3ãã€ãïŒRGBïŒãMACã¢ãã¬ã¹ã¯6ãã€ããUUIDã¯16ãã€ããHexã¯ãã®ãã€ãã¬ãã«ã®æ§é ãèŠèŠçã«ä¿æããŸãã
å°ããªãã€ããªå€ïŒ100ãã€ã以äžã®ããŒã¿ïŒæå·éµãçããã€ããªèå¥åããããã³ã«ããããŒïŒã§ã¯ãHexã®2åã®ãªãŒããŒãããã¯èš±å®¹ç¯å²ã§ãå¯èªæ§ã®å©ç¹ã«èŠåããŸãã32ãã€ãã®æå·éµã§ãHexã¯64æå vs Base64ã®44æåã20æåã®å·®ã¯ã»ãšãã©åé¡ã«ãªããŸãããã64åã®Hexæåãæ°ããŠã確ãã«32ãã€ãã ããšèŠèŠçã«ç¢ºèªã§ããã®ã¯éçºäžã«äŸ¿å©ã§ãã
Base64ãšã³ã³ãŒãã£ã³ã°ã䜿ãã¹ãå Žé¢
ã¡ãŒã«æ·»ä»ãã¡ã€ã«ïŒMIMEïŒïŒå ã ã®ãŠãŒã¹ã±ãŒã¹ã§ããSMTPã¯7ãããASCIIãªã®ã§ããã€ããªæ·»ä»ãã¡ã€ã«ã¯ããã¹ããšã³ã³ãŒããå¿ èŠã§ããBase64ã®33%ãªãŒããŒãããã¯ãæ°ã¡ã¬ãã€ãã®ãã¡ã€ã«ã§Hexã®100%ãªãŒããŒãããã«å€§ããåããŸããéã£ãããšã®ãããã¹ãŠã®ã¡ãŒã«æ·»ä»ãã¡ã€ã«ãBase64ã䜿ã£ãŠããŸããMIMEæšæºïŒRFC 2045ïŒã¯76æåããšã«æ¹è¡ããBase64ãèŠå®ããŠããŸãã
JSON/XMLãžã®ãã€ããªåã蟌ã¿ïŒAPIãããã¹ãããŒã¹ã®ãã©ãŒãããã«ç»åããã¡ã€ã«ããã€ããªããããå«ããå¿ èŠããããšããBase64ãæšæºã§ããAWS S3ã®çœ²åä»ãPOSTããªã·ãŒã¯Base64ãšã³ã³ãŒããããJSONã䜿ããŸããJWTã¯ãã€ããŒããBase64urlã§ãšã³ã³ãŒãããŸããHTMLã®Data URIïŒdata:image/png;base64,...ïŒã¯ããŒã¯ã¢ããã«çŽæ¥ç»åãåã蟌ã¿ãŸãã33%ã®ãªãŒããŒãããã¯ããã¹ãå®å šæ§ã®ã³ã¹ãã§ãã
ããã¹ãç°å¢ã§ã®å€§ããªãã€ããªããŒã¿ïŒæ°çŸãã€ã以äžã§ãµã€ãºãéèŠãªå Žé¢ã§ã¯ãBase64ãåã¡ãŸãã100KBã®ç»åã¯Hexã§200KBãBase64ã§133KBããããã¯ãŒã¯æ¥ç¶äžã§67KBã®å·®ã¯ç©ã¿éãªããŸããbase64-encoderããŒã«ã¯æå€§50MBã®ãã¡ã€ã«ãæ±ãããšã³ã³ãŒãåŸã®ãµã€ãºã衚瀺ããŠãªãŒããŒããããè©äŸ¡ã§ããŸãã
èªèšŒããŒã¯ã³ãšCookieïŒOAuthããŒã¯ã³ãã»ãã·ã§ã³IDãAPIããŒã¯Base64ãŸãã¯Base64urlãšã³ã³ãŒãã£ã³ã°ããã䜿ããŸããã³ã³ãã¯ããªè¡šçŸã¯HTTPããããŒïŒå®çšçãªãµã€ãºå¶éçŽ8KBïŒãCookieïŒCookieããã4KBå¶éïŒã«é©ããŠããŸããBase64urlïŒ+ã®ä»£ããã«-ã/ã®ä»£ããã«_ã䜿çšïŒã¯è¿œå ã®ããŒã»ã³ããšã³ã³ãŒãã£ã³ã°ãªãã«URLã»ãŒããªç°å¢åãã«èšèšãããŠããŸãã
URLãšã³ã³ãŒãã£ã³ã°ïŒç¹æ®ãªã±ãŒã¹
URLãšã³ã³ãŒãã£ã³ã°ïŒããŒã»ã³ããšã³ã³ãŒãã£ã³ã°ïŒã¯å³å¯ã«ã¯ãã€ããªããããã¹ããžã®ãšã³ã³ãŒãã£ã³ã°ã§ã¯ãããŸããââæååãURLã§å®å šã«ããããã¹ãããããã¹ããžã®ãšã³ã³ãŒãã£ã³ã°ã§ããåå®å šã§ãªããã€ãã¯%XXïŒããŒã»ã³ãèšå· + 2æ¡ã®16鲿°ïŒã«ãªããŸããã¹ããŒã¹ã¯%20ãã¢ã³ããµã³ãã¯%26ãæ¥æ¬èªã®æåïŒ3ãã€ãã®UTF-8ïŒã¯%E4%B8%ADã®ããã«ãªããŸãããªãŒããŒãããã¯å€§ããå€åããŸãïŒASCIIæåã¯0%ã§ããããã¹ãŠç¹æ®æåã®æååã¯3åã«èšåŒµããŸãã
URLãšã³ã³ãŒãã£ã³ã°ã¯ã³ã³ããã¹ãäŸåã§ããURLãã¹ã§ã¯/ã¯æ§é çïŒãšã³ã³ãŒãããªãïŒãã¯ãšãªãã©ã¡ãŒã¿å€ã§ã¯/ã¯ããŒã¿ïŒãšã³ã³ãŒãããïŒããã©ã°ã¡ã³ãã§ã¯ã»ãšãã©ãšã³ã³ãŒãäžèŠããã®ã³ã³ããã¹ãäŸåæ§ãURLãšã³ã³ãŒãã£ã³ã°ãBase64ãHexãšæ ¹æ¬çã«ç°ãªããã®ã«ããŠããŸããåŸè ã¯ã³ã³ããã¹ãã«é¢ä¿ãªããã¹ãŠãåäžã«ãšã³ã³ãŒãããŸããurl-encoderããŒã«ã§ã³ã³ããã¹ãéžæä»ãã®ã€ã³ã¿ã©ã¯ãã£ããªãšã³ã³ãŒãã£ã³ã°ãã§ããŸãã
URLãšã³ã³ãŒãã£ã³ã°ãBase64ãšåºäŒããšãïŒBase64ããŒã¿ãURLã«å ¥ããå¿ èŠãããå ŽåãæšæºBase64ã®+ãš/æåã¯ããŒã»ã³ããšã³ã³ãŒãã£ã³ã°ïŒ%2Bãš%2FïŒãå¿ èŠã§ãããããBase64urlãååšããçç±ã§ãââ+ã-ã«ã/ã_ã«çœ®ãæããŠäºéãšã³ã³ãŒãã£ã³ã°ãåé¿ããŸããJWTãBase64urlã䜿ãã®ã¯ãURLãHTTPããããŒã«åºçŸããããã§ããURLã§äŒéãããããŒã¿ã«ã¯åžžã«Base64urlïŒæšæºBase64ã§ã¯ãªãïŒã䜿ããŸãããã
å žåçãªãŠãŒã¹ã±ãŒã¹ã®ãµã€ãºæ¯èŒïŒãã€ããªæåå"Hello, World! ããã«ã¡ã¯"ïŒ22ãã€ãã®UTF-8ïŒã®ãšã³ã³ãŒãã£ã³ã°ãHexïŒ44æåãBase64ïŒ32æåãURLãšã³ã³ãŒãã£ã³ã°ïŒ"Hello%2C%20World%21%20%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF" = 67æåãURLãšã³ã³ãŒãã£ã³ã°ã¯ãã€ããªããŒã¿ã«ææªã§ããåãã€ãã3æåïŒ%XXïŒã«ãšã³ã³ãŒããã€ã€ASCIIæåã¯ãã®ãŸãŸæ®ãããããªãŒããŒãããã¯å ¥åå 容ã«å®å šã«äŸåããŸãã
çãã€ããªïŒããã¹ããšã³ã³ãŒãã£ã³ã°ãééããªå Žé¢
çããããšã³ã³ãŒãããªãããšãããããŸããéä¿¡åŽãšåä¿¡åŽã®äž¡æ¹ããã€ããªããŒã¿ãæ±ãããªããããã¹ããšã³ã³ãŒãã£ã³ã°ã¯äžèŠãªãªãŒããŒããããšåŠçæéã远å ããã ãã§ããContent-Type: application/octet-streamã®HTTPã¬ã¹ãã³ã¹ã¯çãã€ããéããŸããWebSocketãã€ããªãã¬ãŒã ã¯çãã€ããéããŸããmultipart/form-dataã®ãã¡ã€ã«ã¢ããããŒãã¯çãã€ããéããŸããProtocol BuffersãšMessagePackã¯JSON+Base64ããå°ããéããã€ããªã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãã©ãŒãããã§ãã
ã«ãŒã«ïŒè»¢éãã£ãã«ãããã¹ããèŠæ±ããå Žåã®ã¿ããã¹ããšã³ã³ãŒãã£ã³ã°ïŒBase64ãHexïŒã䜿ããŸããã¡ãŒã«ïŒSMTPïŒã¯ããã¹ãèŠæ± â Base64ã䜿ããJSONãã€ããŒãã¯ããã¹ãèŠæ± â ãã€ããªãã£ãŒã«ãã«Base64ãURLãã©ã¡ãŒã¿ã¯ããã¹ãèŠæ± â URLãšã³ã³ãŒãã£ã³ã°ãŸãã¯Base64urlããããHTTPããã£ãWebSocketã¡ãã»ãŒãžãgRPCåŒã³åºãããã¡ã€ã«I/Oã¯ãã¹ãŠãã€ãã£ãã«ãã€ããªããµããŒãããŸãââãããã®ãã£ãã«ã§ãã€ããªããŒã¿ããšã³ã³ãŒãããã®ã¯åž¯åå¹ ãšCPUã®ç¡é§ã§ãã
ããã©ãŒãã³ã¹æ¯èŒïŒ1MBã®ãã€ããªããŒã¿ã®ãšã³ã³ãŒãã£ã³ã°ãBase64ãšã³ã³ãŒãã£ã³ã°ã¯çŽ2msã§1.33MBãçæãHexãšã³ã³ãŒãã£ã³ã°ã¯çŽ3msã§2MBãçæãçãã€ããªã®éä¿¡ã¯ãšã³ã³ãŒãã£ã³ã°æé0msã§1MBã5MBã®ç»åãè¿ãREST APIã§ãJSONã«Base64ãšã³ã³ãŒããããš6.67MBã®è»¢é + ãšã³ã³ãŒã/ãã³ãŒãã®CPUæéãå¥ã®ãã€ããªã¬ã¹ãã³ã¹ãšããŠæäŸãããš5MBã®è»¢é + ãŒãã®ãšã³ã³ãŒãã£ã³ã°ãªãŒããŒãããã倧ããªãã€ããŒãã§ã®éžæã¯æçœã§ãã
ãã€ããªããã¢ãããŒãïŒã¡ã¿ããŒã¿ã«JSONããã€ããŒãã«ãã€ããªã䜿ããŸããäžè¬çãªãã¿ãŒã³ïŒAPIããã€ããªãªãœãŒã¹ãžã®URLãå«ãJSONãè¿ããã¯ã©ã€ã¢ã³ããå¥éååŸããŸããããã«ããæ§é åãããã¡ã¿ããŒã¿ïŒã¿ã€ãã«ããµã€ãºãcontent-typeïŒã¯ããã¹ããã¬ã³ããªãŒãªãã©ãŒãããã§ãå®éã®ããŒã¿ã¯å¹ççãªãã€ããªè»¢éã§åŸãããŸãããã¹ãŠã®CDNããªããžã§ã¯ãã¹ãã¬ãŒãžãµãŒãã¹ãã¡ãã£ã¢ãã©ãããã©ãŒã ããã®ãã¿ãŒã³ã䜿ã£ãŠããŸãã
æ¯èŒè¡šãšå€æã¬ã€ã
ãµã€ãºãªãŒããŒãããïŒçãã€ã㪠= 0%ãBase64 = 33%ãHex = 100%ãURLãšã³ã³ãŒãã£ã³ã° = 0-200%ïŒå 容ã«ããïŒããµã€ãºã«ææãªã¢ããªã±ãŒã·ã§ã³ïŒã¢ãã€ã«APIãçµã¿èŸŒã¿ã·ã¹ãã ãé«ã¹ã«ãŒããããµãŒãã¹ïŒã§ã¯ãå¯èœãªéããã€ããªè»¢éã§ãšã³ã³ãŒãã£ã³ã°ãªãŒããŒããããæå°åããããã¹ããšã³ã³ãŒãã£ã³ã°ãå¿ èŠãªå Žåã¯Base64ã䜿ããŸãããã
å¯èªæ§ïŒHexã¯éçºè ã«ãšã£ãŠæãèªã¿ãããïŒãã€ãæŽåããããã°ããŒã«ã§éŠŽæã¿æ·±ãïŒãBase64ã¯ã³ã³ãã¯ãã ãäžéæïŒåã ã®ãã€ããèŠèŠçã«è§£æã§ããªãïŒãURLãšã³ã³ãŒãã£ã³ã°ã¯ASCIIããã¹ãã«ã¯èªã¿ãããããã€ããªã«ã¯éããçãã€ããªã¯Hexãã¥ãŒã¢ãªãã§ã¯èªããªããéçºãšãããã°äžã«äººéãããŒã¿ãæ€æ»ããå¿ èŠããããã©ããã§éžã³ãŸãããã
äºææ§ïŒURLãšã³ã³ãŒãã£ã³ã°ã¯URLå ã§æ©èœããŸãïŒå®çŸ©äžïŒãBase64ã¯JSONãXMLãã¡ãŒã«ãã»ãšãã©ã®ããã¹ãç°å¢ã§æ©èœããŸããHexã¯ããã¹ãã䜿ãããšãããªãã©ãã§ãæ©èœããŸããã倧ããªããŒã¿ã®æšæºçãªéžæã«ãªãããšã¯çšã§ããçãã€ããªã¯HTTPããã£ãWebSocketããã¡ã€ã«ããã€ããªãããã³ã«ã§æ©èœããŸãããJSONãURLã§ã¯äœ¿ããŸããããšã³ã³ãŒãã£ã³ã°ã転éãã£ãã«ã®èŠä»¶ã«åãããŸãããã
倿ããªãŒïŒè»¢éãã£ãã«ã¯ãã€ããªå¯Ÿå¿ãïŒâ çãã€ããªã䜿ããURLãïŒâ ããã¹ãå€ã«ã¯URLãšã³ã³ãŒãã£ã³ã°ããã€ããªå€ã«ã¯Base64urlãJSON/XMLãïŒâ ãã€ããªãã£ãŒã«ãã«Base64ããããã°/衚瀺çšãïŒâ Hexãããã·ã¥ãæå·å€ãïŒâ HexïŒæ £äŸïŒãã¡ãŒã«æ·»ä»ãïŒâ Base64ïŒMIMEæšæºïŒãè¿·ã£ããããã€ããªãããã¹ãã«ããã·ããªãªã§ã¯Base64ãæãå®å šãªããã©ã«ãã§ãã
16ãã€ãã®ãã€ããªããŒã¿ïŒUUIDïŒã®ãšã³ã³ãŒãã£ã³ã°æ¯èŒïŒ
çãã€ããªïŒ 16ãã€ãïŒããã¹ããšããŠè¡šç€ºäžå¯ïŒ
HexïŒ "550e8400e29b41d4a716446655440000"ïŒ32æåïŒ
Base64ïŒ "VQ6EAOKbQdSnFkRmVUQAAA=="ïŒ24æåïŒ
Base64urlïŒ "VQ6EAOKbQdSnFkRmVUQAAA"ïŒ22æåãããã£ã³ã°ãªãïŒ
1KBã®ãã€ããªããŒã¿ã®ãšã³ã³ãŒãã£ã³ã°æ¯èŒïŒ
çãã€ããªïŒ 1,024ãã€ã
HexïŒ 2,048æåïŒ+100%ïŒ
Base64ïŒ 1,368æåïŒ+33%ïŒ
URLãšã³ã³ãŒãïŒ~3,072æåïŒ+200%ãææªã±ãŒã¹ïŒ
é床ïŒ10MBãšã³ã³ãŒãã£ã³ã°ãNode.js M1 MacïŒïŒ
Buffer.toString('hex'): ~8ms
Buffer.toString('base64'): ~5ms
ãšã³ã³ãŒããªãïŒçïŒïŒ ~0msãšã³ã³ãŒãã£ã³ã°ãã©ãŒãããéžæã§ããããééã
ééã1ïŒæ¢ã«ããã¹ãã®ããŒã¿ãBase64ãšã³ã³ãŒããããJSONæååãå¥ã®JSONãã£ãŒã«ãã«å ¥ããåã«Base64ãšã³ã³ãŒããããšãç¡æå³ã«33%ã®ãªãŒããŒãããã远å ããŠããŸããJSONã¯JSON ãå«ããããŸãïŒãšã¹ã±ãŒããããæååãŸãã¯ãã¹ãããããªããžã§ã¯ããšããŠïŒãå®éã®ãã€ããªããŒã¿ïŒç»åããã¡ã€ã«ãæå·çŽ æïŒã®ã¿Base64ãšã³ã³ãŒãããŸããããããã¹ãããŒã¿ã¯ããã¹ãã®ãŸãŸã«ããŸãããã
ééã2ïŒå€§ããªãã€ããªãã€ããŒãã«Hexã䜿ãã10MBã®ãã¡ã€ã«ãHexã«ãããš20MBââBase64ïŒ13.3MBïŒãçãã€ããªïŒ10MBïŒãšæ¯ã¹ãŠ10MBã®çŽç²ãªç¡é§ã§ããHexã¯è¡šç€ºãšãããã°çšã§ãããããŒã¿è»¢éçšã§ã¯ãããŸãããAPIã§Hexãšã³ã³ãŒãããããã¡ã€ã«ãéã£ãŠãããªããBase64ããã€ããªã«åãæ¿ããŠå³åº§ã«33-50%ã®åž¯åå¹ ãç¯çŽããŸãããã
ééã3ïŒåãã·ã¹ãã å ã§ãšã³ã³ãŒãã£ã³ã°ãã©ãŒããããæ··åšããããäžéšã®ãã€ããªãã£ãŒã«ããHexã§ãä»ãBase64ã§è¿ããã©ã¡ããã©ã¡ããããã¥ã¡ã³ãã«æžããŠããªãAPIãèŠãããšããããŸããAPIå ã®ãã¹ãŠã®ãã€ããªããŒã¿ã«äžã€ã®ãã©ãŒããããéžã³ãæç¢ºã«ããã¥ã¡ã³ãåããŸããããäžè²«æ§ãHexãBase64ãšããŠãã³ãŒãããïŒãŸãã¯ãã®éã®ïŒãã°ãé²ããŸãã
ééã4ïŒãã³ãŒãã³ã¹ããèæ ®ããªãããšã³ã³ãŒããšãã³ãŒãã¯ç¡æã§ã¯ãããŸããââCPUãšã¡ã¢ãªãæ¶è²»ããŸããæ¯ç§æ°çŸäžãªã¯ãšã¹ããåŠçããé«ã¹ã«ãŒããããµãŒãã¹ã§ã¯ãBase64ãšã³ã³ãŒã/ãã³ãŒãã®çޝç©ã³ã¹ããç¡èŠã§ããªããªããŸããJSONã«å ¥ããããã ãã«ããŒã¿ããšã³ã³ãŒãããå察åŽã§å³åº§ã«ãã³ãŒãããŠãããªãããã€ããªãããã³ã«ïŒgRPCãMessagePackãProtocol BuffersïŒããã®ãªãŒããŒããããå®å šã«æé€ã§ããªããæ€èšããŸãããã