{"id":360447,"date":"2024-05-21T00:53:31","date_gmt":"2024-05-21T00:53:31","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=360447"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=360447","title":{"rendered":"<span>\u041c\u0430\u043f\u044b \u0432 Go: \u0443\u0440\u043e\u0432\u0435\u043d\u044c Pro<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u043c\u0438\u0440\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445: \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0438\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438; \u0438 \u043c\u0430\u043f\u044b \u2014 \u0441\u043b\u043e\u0432\u0430\u0440\u0438 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043c\u0430\u043f\u044b \u0432 \u044f\u0437\u044b\u043a\u0435 Go \u0438 \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u043a\u043e\u0434\u0435. \u041c\u0430\u043f\u0430 \u0432 Go \u2014 \u044d\u0442\u043e \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440 \u00ab\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/41f\/621\/6a3\/41f6216a347867849ca336a893361bd7.png\" width=\"7652\" height=\"4272\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/41f\/621\/6a3\/41f6216a347867849ca336a893361bd7.png\"\/><\/figure>\n<h3>\u0422\u0435\u043e\u0440\u0438\u044f \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446<\/h3>\n<p>\u0425\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u044b \u00ab\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u0440\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:\u00a0<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0438\u0441\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u043a\u043b\u044e\u0447\u0443,\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u044b,<\/p>\n<\/li>\n<li>\n<p>\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u044b.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0425\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0417\u0430\u0442\u0435\u043c \u043e\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0442\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0435.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u044b, \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043c\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043b\u044e\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441, \u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043f\u0430\u0440\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/629\/b78\/0db\/629b780db193e5ab57283f6d4f15cecb.png\" width=\"7452\" height=\"2324\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/629\/b78\/0db\/629b780db193e5ab57283f6d4f15cecb.png\"\/><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a \u0434\u0432\u0443\u043c \u0440\u0430\u0437\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u0430\u043c, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0438\u043d\u0434\u0435\u043a\u0441. \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0435\u0439. \u0415\u0451 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0446\u0435\u043f\u043e\u0447\u0435\u043a<\/p>\n<p>\u041f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u043c\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u043a\u043b\u044e\u0447 \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0437\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438\u043b\u0438 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u043d\u0430\u0434\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0451, \u043d\u043e \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e \u043d\u0435\u0439 \u043f\u043e\u0438\u0441\u043a. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0447\u0442\u043e \u0438 \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435, \u0438 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u0441\u043a\u043e\u043c\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0438\u043b\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b29\/8c3\/d80\/b298c3d80b7760c128822d86be5c7a86.png\" width=\"7532\" height=\"2844\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b29\/8c3\/d80\/b298c3d80b7760c128822d86be5c7a86.png\"\/><\/figure>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043d\u043e\u0432\u044b\u0439. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0438 \u043d\u043e\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0445\u044d\u0448\u0430\u043c\u0438\u00a0(\u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/046\/4eb\/ca8\/0464ebca874db721879f87d6ff7f5bf1.png\" width=\"7624\" height=\"2496\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/046\/4eb\/ca8\/0464ebca874db721879f87d6ff7f5bf1.png\"\/><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043b\u043e\u0445\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0445\u044d\u0448\u0438, \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u00ab\u043c\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0438 N \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u044f\u0447\u0435\u0439\u043a\u0443, \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u043e\u0439 N\u00bb. \u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0442\u0430\u043a\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(N), \u0430 \u044d\u0442\u043e \u043d\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435, \u0447\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443.<\/p>\n<p>\u0412 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043d\u0430\u043c \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043d\u0430\u0448\u0435\u0439 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u2014 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435, \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u0432\u0430\u0440 \u0432 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0443: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0440\u0443\u043a\u0442\u044b \u0438\u043b\u0438 \u043e\u0432\u043e\u0449\u0438. \u0422\u043e\u0433\u0434\u0430 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u00ab\u0431\u0430\u043a\u0435\u0442\u044b\u00bb \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 10 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0431\u0430\u043a\u0435\u0442\u0435 \u0441 \u0444\u0440\u0443\u043a\u0442\u0430\u043c\u0438 \u0438 10 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0431\u0430\u043a\u0435\u0442\u0435 \u0441 \u043e\u0432\u043e\u0449\u0430\u043c\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6a2\/d2d\/354\/6a2d2d3541eff1eb018ef18eb1371139.png\" width=\"7624\" height=\"3676\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6a2\/d2d\/354\/6a2d2d3541eff1eb018ef18eb1371139.png\"\/><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u2014 \u0444\u0440\u0443\u043a\u0442 \u0438\u043b\u0438 \u043e\u0432\u043e\u0449. \u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c 10 \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0439. \u0422\u0430\u043a \u043c\u044b \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430, \u043d\u043e \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u0430\u043a\u0435\u0442\u0430 \u043d\u0435 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438.<\/p>\n<p>\u0415\u0449\u0451 \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0435. \u0415\u0441\u043b\u0438 \u0435\u0451 \u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c, \u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0438 \u043f\u043e\u0438\u0441\u043a \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c. \u0427\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0440\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043a\u0435\u0442\u043e\u0432, \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u043b\u0438 load factor.<\/p>\n<p><strong>\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u043b\u0438 load factor <\/strong>\u2014 \u044d\u0442\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0430\u0440 \u00ab\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb \u043a \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u044e\u0442 \u043f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0442\u043e \u0445\u044d\u0448-\u043c\u0430\u043f\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044e\u0442, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u0430\u0440 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442 \u0438 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442.<\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f map \u0432 Go 1.21.1<\/h3>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u044f \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u0435\u043b\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0431\u043b\u043e\u043a\u0430\u043c. \u0412\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>goarch.PtrSize=8<\/code>.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0430\u043f\u043e\u0439:<\/p>\n<pre><code class=\"go\">\/\/ go\/src\/runtime\/map.go  type hmap struct {   \/\/ ...more code   count       int   B           uint 8   noverflow   uint 16   hash0       uint 32   buckets     unsafe.Pointer   oldbuckets  unsafe.Pointer }<\/code><\/pre>\n<p><strong>count <\/strong>\u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440 \u00ab\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb.<\/p>\n<p><strong>B<\/strong> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043a\u0435\u0442\u043e\u0432, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u0435 \u0447\u0435\u0440\u0435\u0437 log<sub>2<\/sub>. \u0422\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u0438\u0442\u043e\u0432\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"log_2 CountBuckets = B \\\\ 2^B = CountBuckets\\\\ log_2 1 = 0\\\\log_2 2 = 1\\\\log_2 4 = 2\\\\log_2 8 = 3\" alt=\"log_2 CountBuckets = B \\\\ 2^B = CountBuckets\\\\ log_2 1 = 0\\\\log_2 2 = 1\\\\log_2 4 = 2\\\\log_2 8 = 3\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5cf\/46e\/5e6\/5cf46e5e6238a050dfa2c4aeba52453f.svg\" width=\"697\" height=\"152\"\/><\/p>\n<p><strong>noverflow<\/strong> \u2014 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0431\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p><strong>hash0 <\/strong>\u2014 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u0438 \u0432 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043a \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f\u043c.<\/p>\n<p><strong>buckets<\/strong> \u2014 \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u043a\u0435\u0442\u043e\u0432. \u0412 Go \u044d\u0442\u043e \u044f\u0447\u0435\u0439\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0431\u0430\u043a\u0435\u0442\u044b.<\/p>\n<p><strong>oldbuckets<\/strong> \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u043a\u0435\u0442\u043e\u0432, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0433\u0434\u0430 \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435. \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044f\u0447\u0435\u0439\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<pre><code class=\"go\">\/\/ go\/src\/runtime\/type.go  type MapType struct {   \/\/ ...more code   Hasher     func(unsafe.Pointer, uintptr) uintptr }<\/code><\/pre>\n<p><strong>Hasher<\/strong> \u2014 \u044d\u0442\u043e \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b key, hash0 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 hash. \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"go\">hash := t.Hasher(noescape(unsafe.Pointer(&amp;s)), uintptr(h.hash0))<\/code><\/pre>\n<pre><code class=\"go\">\/\/go\/src\/runtime\/map.go  type bmap struct {   \/\/ tophash generally contains the top byte of the hash value   \/\/ for each key in this bucket.   tophash [bucketCnt]uint8 }<\/code><\/pre>\n<p><strong>tophash<\/strong> \u2014 \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 8 \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0431\u0430\u0439\u0442 \u0445\u044d\u0448\u0435\u0439 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0432 \u0431\u0430\u043a\u0435\u0442\u0435.<\/p>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0431\u0430\u043a\u0435\u0442\u0435 \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0432\u0430\u0436\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442<\/p>\n<pre><code class=\"go\">const bucketCnt = 8<\/code><\/pre>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0430\u043f\u044b<\/h3>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441 \u0442\u0438\u043f\u043e\u043c <code>map[string]string<\/code> \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ol>\n<li>\n<p><code>var m map[string]string<\/code><\/p>\n<\/li>\n<li>\n<p><code>m := make(map[string]string)<\/code><\/p>\n<\/li>\n<\/ol>\n<p>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0442\u043e\u043c,\u0447\u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>make<\/code> \u043c\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0438 <code>hmap<\/code>.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 map \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>make<\/code>. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 map \u0447\u0435\u0440\u0435\u0437 make \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>makemap<\/code>.<\/p>\n<pre><code class=\"go\">  func makemap(t *maptype, hint int, h *hmap) *hmap {     \/\/...more code  1   \/\/ initialize Hmap     if h == nil {       h = new(hmap)     }     h.hash0 = fastrand()  2   B := uint8(0)     for overLoadFactor(hint, B) {       B++     }     h.B = B  3   if h.B != 0 {       var nextOverflow *bmap       h.buckets, nextOverflow = makeBucketArray(t, h.B, nil)       \/\/...more code     }      return h   }<\/code><\/pre>\n<p><strong>\u0411\u043b\u043e\u043a 1.<\/strong> \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 <code>h *hmap<\/code>. \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0435\u0442, \u0442\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c. \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c hash0.<\/p>\n<p><strong>\u0411\u043b\u043e\u043a 2.<\/strong> \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043a\u0435\u0442\u043e\u0432 <em>B<\/em> \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <em>log<\/em> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 <code>hint<\/code>. <code>hint<\/code> \u2014 \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>make(map[string]string, hint)<\/code>.<\/p>\n<p><strong>\u0411\u043b\u043e\u043a 3.<\/strong> \u0415\u0441\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0435 \u0440\u0430\u0432\u043d\u043e 1 (<em>log 1 = 0 = B<\/em>), \u0442\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0431\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<h3>\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u043c\u0430\u043f\u0443<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0432 \u043c\u0430\u043f\u0443 \u043f\u0435\u0440\u0432\u0443\u044e \u043f\u0430\u0440\u0443:<\/p>\n<pre><code class=\"go\">m[\"apple\"] = \"fruit\"<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043c\u0430\u043f\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 (\u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a\u0438):<\/p>\n<pre><code class=\"go\">  func mapassign_faststr(t *maptype, h *hmap, s string) unsafe.Pointer { 1     if h == nil {          panic(plainError(\"assignment to entry in nil map\"))        }        \/\/ ...more code  2     key := stringStructOf(&amp;s)  3     hash := t.Hasher(noescape(unsafe.Pointer(&amp;s)), uintptr(h.hash0))         \/\/ ...more code        if h.buckets == nil {          h.buckets = newobject(t.Bucket) \/\/ newarray(t.bucket, 1)        }        \/\/ ...more code    }<\/code><\/pre>\n<p><strong>\u0428\u0430\u0433 1.<\/strong> \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0431\u044b\u043b\u0430 \u043b\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430\u0448\u0430 <code>hmap<\/code>. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u043d\u0438\u043a\u0443. \u0427\u0430\u0441\u0442\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u2014 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>make<\/code> \u0438 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043d\u0435\u0451 \u043a\u043b\u044e\u0447\/\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p><strong>\u0428\u0430\u0433 2.<\/strong> \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>key<\/code> \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441 \u043a\u043b\u044e\u0447\u0430 &#171;apple&#187;.<\/p>\n<pre><code class=\"go\">\/\/ go\/SDK\/cmd\/runtime\/string.go  type stringStruct struct {    str unsafe.Pointer    len int  }   func stringStructOf(sp *string) *stringStruct {    return (*stringStruct) (unsafe.Pointer(sp))  }<\/code><\/pre>\n<p><code>unsafe.Pointer<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430.<\/p>\n<p><strong>\u0428\u0430\u0433 3.<\/strong> \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c hash \u043a\u043b\u044e\u0447\u0430 &#171;apple&#187; \u0438 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u0432 <code>makemap<\/code>.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043b\u0435\u0439\u0431\u043b\u0430 goto \u2014 <code>again<\/code>.<\/p>\n<pre><code class=\"go\">  func mapassign_faststr(t *maptype, h *hmap, s string) unsafe Pointer {     \/\/ ...more code     again:  1   bucket := hash &amp; bucketMask(h. B)      \/\/ ...more code  2   b := (*bmap) (add(h.buckets, bucket*uintptr(t.BucketSize)))  3   top := tophash(hash)   4   var insertb *bmap      var inserti uintptr      var insertk unsafe.Pointer       \/\/ ...more code  }<\/code><\/pre>\n<p><strong>\u0428\u0430\u0433 1.<\/strong> \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0431\u0430\u043a\u0435\u0442 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u043b\u0435\u0436\u0430\u0442 \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"go\">\/\/ bucketMask returns 1&lt;&lt;b - 1, optimized for code generation.  func bucketMask(b uint8) uintptr {    return bucketShift(b) - 1 }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>1 &lt;&lt; b - 1<\/code>.<\/p>\n<p>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>&lt;&lt;<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u0432\u043b\u0435\u0432\u043e. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>5 &lt;&lt; 3.<\/code> \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0447\u0438\u0441\u043b\u043e 5 \u043d\u0430 3 \u0431\u0438\u0442\u0430 \u0432\u043b\u0435\u0432\u043e. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0438\u0441\u043b\u043e <code>5<\/code> \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>101<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u0434\u0432\u0438\u0433 <code>101<\/code> \u043d\u0430 <code>3<\/code> \u0431\u0438\u0442\u0430 \u0432\u043b\u0435\u0432\u043e \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>101000<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e <code>101000<\/code> \u0432 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>40<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430 (<em>log 1 = 0 = b<\/em>), \u0440\u0430\u0441\u0447\u0451\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p><code>1<\/code> \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0440\u0430\u0432\u043d\u043e <code>1<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u0434\u0432\u0438\u0433 <code>1<\/code> \u043d\u0430 <code>0<\/code> \u0431\u0438\u0442 \u0432\u043b\u0435\u0432\u043e \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>1<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0447\u0438\u0442\u0430\u0435\u043c <code>1<\/code> \u0438\u0437 <code>1<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>0<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043b\u0438 <code>bucketMask(h.B) = bucketMask(0) = 0<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a <code>bucket := hash &amp; bucketMask(h.B)<\/code>. \u0417\u0434\u0435\u0441\u044c <code>&amp;<\/code> \u2014 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0418. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <code>5 &amp; 3<\/code>.<\/p>\n<ul>\n<li>\n<p><code>5<\/code> \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0440\u0430\u0432\u043d\u043e <code>101<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>3<\/code> \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0440\u0430\u0432\u043d\u043e <code>011<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e <code>101 &amp; 011<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>001<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0432\u043e\u0434\u0438\u043c <code>001<\/code> \u043a \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>1<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f &#171;apple&#187; <code>hash = 15088695172686704874<\/code>, \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430 <code>bucketMask(0) = 0<\/code>, \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u0447\u0442\u043e <code>bucket = 15088695172686704874 &amp; 0 = 0<\/code> \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>bucket=0<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0431\u0430\u043a\u0435\u0442 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043f\u0430\u0440\u0443.<\/p>\n<p><strong>\u0428\u0430\u0433 2.<\/strong> \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e <code>*bmap<\/code>.<\/p>\n<p><code>h.buckets<\/code> \u2014 \u044d\u0442\u043e \u044f\u0447\u0435\u0439\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0431\u0430\u043a\u0435\u0442.<\/p>\n<p><code>bucket<\/code> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u0431\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p><code>t.BucketSize=272<\/code> \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u043a\u0435\u0442\u0430 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>add<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u043e\u0432.<\/p>\n<pre><code class=\"go\">\/\/ runtime\/stubs.go  func add(p unsafe.Pointer, x uintptr) unsafe.Pointer {    return unsafe.Pointer(uintptr(p) + x)  }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\text {b = (*bmap)(add(h.buckets, bucket} \\cdot \\text{uintptr(t.BucketSize))) =} \\\\= \\text {h.buckets + bucket}  \\cdot \\text{t.BucketSize} =\\\\ = \\text {h.buckets + bucket}  \\cdot \\text{t.BucketSize} =\\\\= \\text {h.buckets + bucket} \\cdot \\text{272};\" alt=\"\\text {b = (*bmap)(add(h.buckets, bucket} \\cdot \\text{uintptr(t.BucketSize))) =} \\\\= \\text {h.buckets + bucket}  \\cdot \\text{t.BucketSize} =\\\\ = \\text {h.buckets + bucket}  \\cdot \\text{t.BucketSize} =\\\\= \\text {h.buckets + bucket} \\cdot \\text{272};\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b2d\/362\/662\/b2d3626622684495f446d6105c59058e.svg\" width=\"697\" height=\"100\"\/><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u044f\u0447\u0435\u0439\u043a\u0443 \u043f\u0430\u043c\u044f\u0442\u0438. \u0412 \u043d\u0435\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 \u0445\u044d\u0448\u0430 \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p><strong>\u0428\u0430\u0433 3.<\/strong> \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0431\u0430\u0439\u0442 \u043f\u043e hash \u043e\u0442 &#171;apple&#187;.<\/p>\n<pre><code class=\"go\">func tophash(hash uintptr) uint8 {   top := uint8(hash >> (goarch.PtrSize*8 - 8))   if top &lt; minTopHash { \/\/ minTopHash = 5      top += minTopHash   }   return top }<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 <code>tophash<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u043a\u043b\u044e\u0447\u0430 &#171;apple&#187; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>hash=3661323553996174279<\/code>, \u0430 <code>goarch.PtrSize<\/code> \u0440\u0430\u0432\u043d\u043e 8 \u0434\u043b\u044f 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<p><img class=\"formula\" source=\"3661323553996174279>>(8\\cdot8\u22128) \\\\ 3661323553996174279>>(64\u22128) \\\\ 3661323553996174279>>56&#8243; alt=&#187;3661323553996174279>>(8\\cdot8\u22128) \\\\ 3661323553996174279>>(64\u22128) \\\\ 3661323553996174279>>56&#8243; src=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/04b\/7c8\/d0e\/04b7c8d0e93404ac05c664447110a3ae.svg&#187; width=&#187;697&#8243; height=&#187;73&#8243;\/><\/p>\n<p>\u0417\u0434\u0435\u0441\u044c <code>>><\/code> \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u0432\u043f\u0440\u0430\u0432\u043e.<\/p>\n<p>\u0427\u0438\u0441\u043b\u043e 3661323553996174279 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0440\u0430\u0432\u043d\u043e 11001011001111101000100101111110110011101101100111001111000111.<\/p>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u0441\u0434\u0432\u0438\u0433 \u043d\u0430 56 \u0431\u0438\u0442 \u0432\u043f\u0440\u0430\u0432\u043e: 110010<s>11001111101000100101111110110011101101100111001111000111<\/s>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 110010 \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0432 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u0445\u044d\u0448\u0430 \u2014 <code>50<\/code>.<\/p>\n<p><strong>\u0428\u0430\u0433 4.<\/strong> \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438. <code>insertb<\/code> \u2014 \u044d\u0442\u043e \u044f\u0447\u0435\u0439\u043a\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0431\u0430\u0439\u0442\u043e\u0432. <code>inserti<\/code> \u2014 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043f\u043e\u0434 \u043a\u0430\u043a\u0438\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0431\u0430\u0439\u0442, \u043a\u043b\u044e\u0447 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. <code>insertk<\/code> \u2014 \u044d\u0442\u043e \u044f\u0447\u0435\u0439\u043a\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043b\u044e\u0447\u0435\u0439.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0431\u043b\u043e\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043b\u0435\u0439\u0431\u043b\u0430 <code>bucketloop<\/code>. \u0412 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f <code>insertb<\/code> \u0438 <code>inserti<\/code> (\u043f\u043e\u043a\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f):<\/p>\n<pre><code class=\"go\">  func mapassign_faststr(t *maptype, h *hmap, s string) unsafe.Pointer {      \/\/ ...more code    bucketloop:      for {  1     for i := uintptr(0); i &lt; bucketCnt; i++ {  2       if b.tophash[i] != top {  3         if isEmpty(b.tophash[i]) &amp;&amp; insertb == nil {              insertb = b              inserti = i            }  4         if b.tophash[i] == emptyRest {              break bucketloop            }            continue          }   5       k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*goarch.PtrSize))         if k.len != key.len {            continue          }         if k.str != key.str &amp;&amp; !memequal(k.str, key.str, uintptr(key.len)) {           continue          }         inserti = i          insertb = b           k.str = key.str          goto done        }        \/\/...more code     }     \/\/...more code   done:     \/\/...more code   }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u043c\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0432 \u0446\u0438\u043a\u043b\u0435 \u043e\u0442 0 \u0434\u043e \u0434\u043b\u0438\u043d\u044b \u0431\u0430\u043a\u0435\u0442\u0430 (\u0448\u0430\u0433 1). \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 (\u0448\u0430\u0433 2) \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u0445\u044d\u0448\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0431\u0430\u0439\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 <code>b.tophash[i] == top<\/code>, \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0448\u0430\u0433\u0443 5, \u0433\u0434\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043b\u044e\u0447 \u0441 \u043a\u043b\u044e\u0447\u043e\u043c, \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0441\u044f \u0432 \u0431\u0430\u043a\u0435\u0442\u0435. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435 \u0440\u0430\u0432\u043d\u044b, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u043a\u043b\u044e\u0447\u0438 \u0440\u0430\u0432\u043d\u044b, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>inserti<\/code> \u0438 <code>insertb<\/code> \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>goto done<\/code>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043d\u0430 \u0448\u0430\u0433\u0435 2 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0448\u0430\u0433\u0443 3 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 i \u043f\u0443\u0441\u0442\u043e\u0439 \u0438\u043b\u0438 \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u043e\u043d\u0430 \u043f\u0443\u0441\u0442\u0430\u044f, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c <code>insertb<\/code> \u0438 <code>inserti<\/code> \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0448\u0430\u0433\u0443 4, \u0433\u0434\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043f\u0443\u0441\u0442\u044b\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438\u043b\u0438 \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u0443\u0441\u0442\u044b\u0435, \u0442\u043e \u043c\u044b \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448 \u043f\u043e\u0438\u0441\u043a \u0447\u0435\u0440\u0435\u0437 <code>break bucketloop<\/code> \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u044d\u0442\u0430\u043f\u0443.<\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u0448\u0430\u0433\u0430 3 \u043e\u0442 \u0448\u0430\u0433\u0430 4 \u2014 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u0448\u0430\u0433\u0435 3 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0442\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0438, \u0430 \u043d\u0430 \u0448\u0430\u0433\u0435 4 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u044f\u0447\u0435\u0439\u043a\u0438. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432 \u0431\u0430\u043a\u0435\u0442\u0435 \u043d\u0435\u0442 \u043a\u043b\u044e\u0447\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u043d\u0430\u0448\u0435\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u0445\u044d\u0448 \u043a\u043b\u044e\u0447\u0430, \u043a\u043b\u044e\u0447\u0430 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044e \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043c\u0430\u043f\u0435:<\/p>\n<pre><code class=\"go\">  func mapassign_faststr(t *maptype, h *hmap, s string) unsafe.Pointer {      \/\/ ...more code    bucketloop:      for {...}      \/\/ ...more code   1   insertb.tophash[inserti&amp;(bucketCnt-1)] = top   2   insertk = add(unsafe.Pointer(insertb), dataOffset+inserti*2*goarch.PtrSize)     \/\/ store new key at insert position  3   *((*stringStruct)(insertk)) = *key      h.count++      \/\/ ...more code     done:  4   elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*2*goarch.PtrSize+inserti*uintptr(t.ValueSize))     \/\/ ...more code  5   return elem    } <\/code><\/pre>\n<p>\u041d\u0430 \u0448\u0430\u0433\u0435 1 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0432\u0438\u0434\u0438\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u00ab\u0418\u00bb, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u043a\u0443\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0448 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0431\u0430\u0439\u0442 \u0445\u044d\u0448\u0430. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0448\u0430\u0433\u0443 2, \u0433\u0434\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u044f\u0447\u0435\u0439\u043a\u0443 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043a\u043b\u044e\u0447\u0430.<\/p>\n<p><code>unsafe.Pointer(insertb)<\/code> \u2014 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0447\u0451\u0442 \u044f\u0447\u0435\u0439\u043a\u0438 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438.<\/p>\n<p><code>dataOffset<\/code> \u2014 \u044d\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 \u0445\u044d\u0448\u0435\u0439, \u0440\u0430\u0432\u043d\u044b\u0439 8 \u0431\u0430\u0439\u0442\u0430\u043c (1 \u0431\u0430\u0439\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0431\u0430\u0439\u0442 \u0445\u044d\u0448\u0430).<\/p>\n<p><code>goarch.PtrSize<\/code> \u2014 8 \u0434\u043b\u044f 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\text {insertk = add(unsafe.Pointer(insertb), dataOffset+inserti}\\cdot\\text{2}\\cdot\\text{goarch.PtrSize)} =\\\\         = \\text {add(unsafe.Pointer(insertb), 8 + inserti} \\cdot \\text{2} \\cdot \\text{8)} = \\\\         = \\text {add(unsafe.Pointer(insertb), 8 + inserti} \\cdot \\text{16)} = \\\\         = \\text{insertb + 8 + inserti} \\cdot \\text{16};\" alt=\"\\text {insertk = add(unsafe.Pointer(insertb), dataOffset+inserti}\\cdot\\text{2}\\cdot\\text{goarch.PtrSize)} =\\\\         = \\text {add(unsafe.Pointer(insertb), 8 + inserti} \\cdot \\text{2} \\cdot \\text{8)} = \\\\         = \\text {add(unsafe.Pointer(insertb), 8 + inserti} \\cdot \\text{16)} = \\\\         = \\text{insertb + 8 + inserti} \\cdot \\text{16};\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/401\/2f4\/20e\/4012f420e81ce516840313deb259b17c.svg\" width=\"697\" height=\"104\"\/><\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u043a\u043b\u044e\u0447\u0430 (\u0448\u0430\u0433 3) \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443 <code>insertk<\/code>.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u0448\u0430\u0433\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044f\u0447\u0435\u0439\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0448\u0430\u0433 4).<\/p>\n<p><code>t.ValueSize=16<\/code> \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0431\u0430\u0439\u0442\u0430\u0445.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\text {elem = add(unsafe.Pointer(insertb), dataOffset+bucketCnt}\\cdot\\text {2}\\cdot\\text {goarch.PtrSize+inserti}\\cdot\\text {uintptr(t.ValueSize))} = \\\\ = \\text {add(unsafe.Pointer(insertb), 8 + 8} \\cdot \\text {2} \\cdot \\text {8 + inserti} \\cdot \\text {16)} =  \\\\ = \\text {add(unsafe.Pointer(insertb), 8 + 128 + inserti} \\cdot \\text {16)} =  \\\\ = \\text {add(unsafe.Pointer(insertb), 136 + inserti} \\cdot \\text {16)} =  \\\\ = \\text {insertb + 136 + inserti} \\cdot \\text {16};\" alt=\"\\text {elem = add(unsafe.Pointer(insertb), dataOffset+bucketCnt}\\cdot\\text {2}\\cdot\\text {goarch.PtrSize+inserti}\\cdot\\text {uintptr(t.ValueSize))} = \\\\ = \\text {add(unsafe.Pointer(insertb), 8 + 8} \\cdot \\text {2} \\cdot \\text {8 + inserti} \\cdot \\text {16)} =  \\\\ = \\text {add(unsafe.Pointer(insertb), 8 + 128 + inserti} \\cdot \\text {16)} =  \\\\ = \\text {add(unsafe.Pointer(insertb), 136 + inserti} \\cdot \\text {16)} =  \\\\ = \\text {insertb + 136 + inserti} \\cdot \\text {16};\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/78f\/7be\/92f\/78f7be92fb29b6f4e297d488e9ec790d.svg\" width=\"951\" height=\"132\"\/><\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 (\u0448\u0430\u0433 5) \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0431\u0430\u043a\u0435\u0442\u0430<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0443 \u0434\u043b\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u0445\u044d\u0448\u0430, \u043a\u043b\u044e\u0447\u0430 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0430\u0448\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"insertb = \\text {b = h.buckets + bucket} \\cdot \\text {272} \\\\ \\text {insertk = }insertb\\text { + 8 + inserti} \\cdot \\text {16 = (h.buckets + bucket} \\cdot \\text {272) + 8 + inserti} \\cdot \\text {16} \\\\ \\text {elem    = }insertb\\text { + 136 + inserti} \\cdot \\text {16 = (h.buckets + bucket} \\cdot \\text {272) + 136 + inserti} \\cdot \\text {16} \\\\\" alt=\"insertb = \\text {b = h.buckets + bucket} \\cdot \\text {272} \\\\ \\text {insertk = }insertb\\text { + 8 + inserti} \\cdot \\text {16 = (h.buckets + bucket} \\cdot \\text {272) + 8 + inserti} \\cdot \\text {16} \\\\ \\text {elem    = }insertb\\text { + 136 + inserti} \\cdot \\text {16 = (h.buckets + bucket} \\cdot \\text {272) + 136 + inserti} \\cdot \\text {16} \\\\\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/544\/691\/90d\/54469190d2de1e3e73a884f93d8488b7.svg\" width=\"720\" height=\"93\"\/><\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044f\u0447\u0435\u0439\u043a\u0430 \u0434\u043b\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u0445\u044d\u0448\u0430, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u043a\u043b\u044e\u0447\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u044f\u0447\u0435\u0439\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0448 \u0431\u0430\u043a\u0435\u0442. <code>h.buckets<\/code>. <code>inserti<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043f\u043e\u0434 \u043a\u0430\u043a\u0438\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0431\u0430\u0439\u0442, \u043a\u043b\u044e\u0447 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. <code>bucket<\/code> \u2014 \u043d\u043e\u043c\u0435\u0440 \u0431\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0431\u0430\u043a\u0435\u0442\u044b \u0432 Go \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u0437\u0430\u0434\u0430\u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f:<\/p>\n<p><code>h.buckets=1000<\/code> \u2014 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u0433\u0434\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0431\u0430\u043a\u0435\u0442\u044b. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u2014 1 (bucket=0). <code>t.BucketSize=272<\/code> \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u043a\u0435\u0442\u0430 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445.<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043d\u0430\u0448\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0430\u044e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0432\u0438\u0434:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\text {insertb = 1000 + bucket} \\cdot \\text {272 = 1000}\\\\ \\text {insertk = (1000 + bucket} \\cdot \\text {272) + 8 + inserti} \\cdot \\text {16 = 1008 + inserti} \\cdot \\text {16}\\\\ \\text {elem    = (1000 + bucket} \\cdot \\text {272) + 136 + inserti} \\cdot \\text {16 = 1136 + inserti} \\cdot \\text {16\u00a0}\\\\\" alt=\"\\text {insertb = 1000 + bucket} \\cdot \\text {272 = 1000}\\\\ \\text {insertk = (1000 + bucket} \\cdot \\text {272) + 8 + inserti} \\cdot \\text {16 = 1008 + inserti} \\cdot \\text {16}\\\\ \\text {elem    = (1000 + bucket} \\cdot \\text {272) + 136 + inserti} \\cdot \\text {16 = 1136 + inserti} \\cdot \\text {16\u00a0}\\\\\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2bd\/47b\/78b\/2bd47b78bf69179adebc8830ee660402.svg\" width=\"697\" height=\"93\"\/><\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e <code>insertb<\/code> \u0438 <code>h.buckets<\/code> \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430\u0448 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0431\u0430\u0439\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <code>inserti<\/code> \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 0 \u0434\u043e 7. \u0420\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0431\u0430\u0439\u0442 \u0445\u044d\u0448\u0435\u0439 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 8 \u0431\u0430\u0439\u0442, \u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043b\u044e\u0447\u0430 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u2014 16 \u0431\u0430\u0439\u0442.<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0434\u043b\u044f <code>inserti = 0<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\text {insertb = 1000} \\\\ \\text {insertk = 1008 + inserti} \\cdot \\text {16 = 1008 + 0} \\cdot \\text {16 = 1008}\\\\ \\text {elem = 1136 + inserti} \\cdot \\text {16 = 1136 + 0} \\cdot \\text {16 = 1136}\\\\\" alt=\"\\text {insertb = 1000} \\\\ \\text {insertk = 1008 + inserti} \\cdot \\text {16 = 1008 + 0} \\cdot \\text {16 = 1008}\\\\ \\text {elem = 1136 + inserti} \\cdot \\text {16 = 1136 + 0} \\cdot \\text {16 = 1136}\\\\\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dde\/d67\/f60\/dded67f60614f6d58a84e09cab31f019.svg\" width=\"697\" height=\"87\"\/><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ee1\/04e\/557\/ee104e557213b161f526b30e53d71568.png\" width=\"15008\" height=\"1744\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ee1\/04e\/557\/ee104e557213b161f526b30e53d71568.png\"\/><\/figure>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0434\u043b\u044f <code>inserti = 1<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\text {insertb = 1000}\\\\ \\text {insertk = 1008 + inserti} \\cdot \\text {16 = 1008 + 1} \\cdot \\text {16 = 1024}\\\\ \\text {elem = 1136 + inserti} \\cdot \\text {16 = 1136 + 1} \\cdot \\text {16 = 1152}\\\\\" alt=\"\\text {insertb = 1000}\\\\ \\text {insertk = 1008 + inserti} \\cdot \\text {16 = 1008 + 1} \\cdot \\text {16 = 1024}\\\\ \\text {elem = 1136 + inserti} \\cdot \\text {16 = 1136 + 1} \\cdot \\text {16 = 1152}\\\\\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d37\/638\/32f\/d3763832f97fcac50ba89e0243dd7db6.svg\" width=\"697\" height=\"87\"\/><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4aa\/fd8\/539\/4aafd8539cb20c26715f6f2b73cbcc97.png\" width=\"15008\" height=\"1744\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4aa\/fd8\/539\/4aafd8539cb20c26715f6f2b73cbcc97.png\"\/><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u0434\u043b\u044f 8 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 \u0445\u044d\u0448\u0435\u0439 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u0430\u043a\u0435\u0442\u0430, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043a\u043b\u044e\u0447\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u0436\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0431\u0430\u043a\u0435\u0442\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u043b\u043e\u043a overflow \u2014 \u043e \u043d\u0451\u043c \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 272 \u0431\u0430\u0439\u0442\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1fb\/4d2\/ae2\/1fb4d2ae2f66770ecaa3c2343cae151c.png\" width=\"15012\" height=\"1828\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1fb\/4d2\/ae2\/1fb4d2ae2f66770ecaa3c2343cae151c.png\"\/><\/figure>\n<p>\u0422\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0431\u0430\u043a\u0435\u0442\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. <\/p>\n<h3>\u041f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0431\u0430\u043a\u0435\u0442\u043e\u0432<\/h3>\n<p>\u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u043a\u0430\u043a \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0431\u0430\u043a\u0435\u0442. \u041d\u043e \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 \u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u0431\u0430\u043a\u0435\u0442? \u0412 Go \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0430\u043a\u0435\u0442\u043e\u0432:<\/p>\n<p>1. \u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440 \u043f\u043e \u044d\u0442\u0438\u043c \u0431\u0430\u043a\u0435\u0442\u0430\u043c. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ce1\/d31\/ec1\/ce1d31ec17a8efe4a39bd3e048afffab.png\" width=\"7652\" height=\"3840\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ce1\/d31\/ec1\/ce1d31ec17a8efe4a39bd3e048afffab.png\"\/><\/figure>\n<p>2. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0430\u043a\u0435\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u0451\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u0431\u0430\u043a\u0435\u0442. \u0415\u0441\u043b\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439, \u0442\u043e \u043c\u044b \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0432 \u0442\u043e\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/064\/95f\/154\/06495f154b0204cc767569f6c2e61e5d.png\" width=\"7652\" height=\"4292\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/064\/95f\/154\/06495f154b0204cc767569f6c2e61e5d.png\"\/><\/figure>\n<p>\u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 Go \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0430\u0440 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u0435\u0439. \u041f\u0440\u0438\u043d\u044f\u0442\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <strong>load factor<\/strong>, \u2014 \u044d\u0442\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0431\u0430\u043a\u0435\u0442\u043e\u0432. \u0412 Go \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 loadFactor \u0440\u0430\u0432\u043d\u043e 6.5, \u2014 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 6.5 \u0438\u043b\u0438 80% \u0434\u043b\u044f \u0431\u0430\u043a\u0435\u0442\u0430 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 8. \u0422\u0430\u043a\u0436\u0435 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u0438 \u0432 Go \u0432\u043b\u0438\u044f\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0431\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Go \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u044b\u0431\u0440\u0430\u043b\u0438 6,5.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f89\/a43\/8fe\/f89a438fe3346dbd4b379d027365ace2.png\" width=\"1390\" height=\"946\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f89\/a43\/8fe\/f89a438fe3346dbd4b379d027365ace2.png\"\/><\/figure>\n<p>\u041f\u0440\u0438 \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430. \u0422\u0435\u043a\u0443\u0449\u0438\u0435 \u043f\u0430\u0440\u044b \u0441 \u0442\u043e\u043f\u0445\u044d\u0448\u0430\u043c\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u044d\u0442\u0438\u043c \u0431\u0430\u043a\u0435\u0442\u0430\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f19\/cbd\/0dd\/f19cbd0dd8517ea0cae931192418cf3a.png\" width=\"7652\" height=\"2972\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f19\/cbd\/0dd\/f19cbd0dd8517ea0cae931192418cf3a.png\"\/><\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0431\u0430\u043a\u0435\u0442\u044b \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0448\u0438\u043c\u0438 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u043c\u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0440\u0430\u0441\u0447\u0435\u0442 \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u0431\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\text {insertb = 1000 + bucket} \\cdot \\text {272}\\\\ \\text {insertk = 1008 + bucket} \\cdot \\text {272 + inserti} \\cdot \\text {16}\\\\ \\text {elem = 1136 + bucket} \\cdot \\text {272 + inserti} \\cdot \\text {16}\\\\\" alt=\"\\text {insertb = 1000 + bucket} \\cdot \\text {272}\\\\ \\text {insertk = 1008 + bucket} \\cdot \\text {272 + inserti} \\cdot \\text {16}\\\\ \\text {elem = 1136 + bucket} \\cdot \\text {272 + inserti} \\cdot \\text {16}\\\\\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/64d\/ff0\/37c\/64dff037c1b9c66ea618bac11a7ed639.svg\" width=\"697\" height=\"87\"\/><\/p>\n<p>\u041c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0431\u0430\u043a\u0435\u0442\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9b3\/244\/47f\/9b324447f7ea205fc652e669b468b175.png\" width=\"7652\" height=\"1900\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9b3\/244\/47f\/9b324447f7ea205fc652e669b468b175.png\"\/><\/figure>\n<p>\u0410 \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8b2\/4cc\/e83\/8b24cce8358593510be9db03827d5a0a.png\" width=\"7652\" height=\"3540\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8b2\/4cc\/e83\/8b24cce8358593510be9db03827d5a0a.png\"\/><\/figure>\n<p>\u041d\u043e \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043d\u0430\u0448\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c 4 \u0431\u0430\u043a\u0435\u0442\u0430: \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0431\u0430\u043a\u0435\u0442\u0435 \u2014 5 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u2014 8, \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u2014 4 \u0438 \u0432 \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u043e\u043c \u2014 1. \u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c load factor = (5 + 8 + 4 + 1) \/ 4 = 4,5. \u041d\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u0430\u0448\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u043c \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0431\u0430\u043a\u0435\u0442\u0435. \u0422\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430 \u2014 overflow \u0432 Go.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/462\/f53\/45c\/462f5345c9d13db0281bc7544c94b56b.png\" width=\"7652\" height=\"2036\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/462\/f53\/45c\/462f5345c9d13db0281bc7544c94b56b.png\"\/><\/figure>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u0431\u0430\u043a\u0435\u0442 \u0438 \u0434\u0430\u0451\u043c \u043d\u0430 \u043d\u0435\u0433\u043e \u0441\u0441\u044b\u043b\u043a\u0443 \u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u0432\u0442\u043e\u0440\u043e\u0439 \u0431\u0430\u043a\u0435\u0442. \u0422\u0430\u043a \u043c\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430\u0448\u0435\u0439 \u043f\u0430\u0440\u044b \u0441 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c. \u0427\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435.<\/p>\n<pre><code class=\"go\">  \/\/ ...more code   again:     bucket := hash &amp; bucketMask(h.B) 1if h.growing() {   growWork_faststr(t, h, bucket) } b := (*bmap)(add(h.buckets, bucket*uintptr(t.BucketSize))) top := tophash(hash)  var insertb *bmap var inserti uintptr var insertk unsafe.Pointer    bucketloop: for {   for i := uintptr(0); i &lt; bucketCnt; i++ { 2       if b.tophash[i] != top {           if isEmpty(b.tophash[i]) &amp;&amp; insertb == nil {     insertb = b     inserti = i   }   if b.tophash[i] == emptyRest {     break bucketloop   }   continue } k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*goarch.PtrSize)) if k.len != key.len {   continue } if k.str != key.str &amp;&amp; !memequal(k.str, key.str, uintptr(key.len)) {   continue }  inserti = i insertb = b  k.str = key.str goto done   } 3  ovf := b.overflow(t)       if ovf == nil {         break       }       b = ovf }   \/\/ If we hit the max load factor or we have too many overflow buckets, \/\/ and we're not already in the middle of growing, start growing. 4if !h.growing() &amp;&amp; (overLoadFactor(h.count+1, h.B) || tooManyOverflowBuckets(h.noverflow, h.B)) { hashGrow(t, h) goto again }  5if insertb == nil { insertb = h.newoverflow(t, b) inserti = 0 } 6insertb.tophash[inserti&amp;(bucketCnt-1)] = top  insertk = add(unsafe.Pointer(insertb), dataOffset+inserti*2*goarch.PtrSize)  \/\/...more code   done:     \/\/...more code<\/code><\/pre>\n<p><strong>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \u00ab\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u0431\u0430\u043a\u0435\u0442.<\/strong><\/p>\n<p>\u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 <em>bucket<\/em>, <em>bmap<\/em> \u0438 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0431\u0430\u0439\u0442 \u0445\u044d\u0448\u0430 (<em>top<\/em>) \u0432 \u0431\u043b\u043e\u043a\u0435 <em>again<\/em>. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <em>h.growing()<\/em> \u043d\u0430 \u0448\u0430\u0433\u0435 1 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u2014 \u0440\u0430\u0441\u0442\u0451\u0442 \u0431\u0430\u043a\u0435\u0442 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u043b\u0438 \u043d\u0435\u0442. \u041f\u043e\u043a\u0430 \u043c\u0430\u043f\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0440\u0430\u0441\u0442\u0451\u0442 \u0438 <code>h.growing()<\/code><em> <\/em>\u0432\u0435\u0440\u043d\u0451\u0442<em> <\/em><code>false<\/code>. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a <code>if b.tophash[i] != top<\/code> (\u0448\u0430\u0433 2). \u0414\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0432\u0435\u0440\u0445\u043d\u0438\u0435 \u0431\u0430\u0439\u0442\u044b \u0445\u044d\u0448\u0435\u0439 \u0440\u0430\u0437\u043d\u044b\u0435, \u044d\u0442\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u0435\u0440\u043d\u043e \u0438 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0435\u0433\u043e. \u041d\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043b\u043e\u0436\u043d\u044b\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0431\u0430\u043a\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 continue, \u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0448\u0430\u0433\u0443 3.<\/p>\n<p>\u041d\u0430 \u043d\u0451\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0448\u0435\u0433\u043e overflow \u0431\u0430\u043a\u0435\u0442\u0430:<\/p>\n<pre><code class=\"go\">func (b *bmap) overflow(t *maptype) *bmap { return *(**bmap)(add(unsafe.Pointer(b), uintptr(t.BucketSize)-goarch.PtrSize)) } \/\/  uintptr(t.BucketSize)-goarch.PtrSize = 272 - 8 = 264 <\/code><\/pre>\n<p>\u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e <code>overflow<\/code> \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 8 \u0431\u0430\u0439\u0442 \u0432 \u0431\u0430\u043a\u0435\u0442\u0435. \u0412 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <code>ovf=nil<\/code>, \u0438 \u043c\u044b \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>break<\/code>.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0448\u0430\u0433\u0443 4, \u0433\u0434\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u0448\u0430 \u043c\u0430\u043f\u0430 \u043d\u0435 \u0440\u0430\u0441\u0442\u0451\u0442 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u0438\u0437 \u0443\u0441\u043b\u043e\u0432\u0438\u0439: \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0431\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p>\u0421 \u044d\u0442\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u043e \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u0438.<\/p>\n<h4>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 (overflow) \u0431\u0430\u043a\u0435\u0442, \u043c\u044b \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043d\u0430 \u0448\u0430\u0433\u0435 4 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0443\u0441\u043b\u043e\u0432\u0438\u044e <code>if insertb == nil<\/code> (\u0448\u0430\u0433 5).<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <em>true<\/em>, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u0448\u0430\u0433\u0435 2 \u043c\u044b \u043d\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 <em>insertb<\/em>. \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u0431\u0430\u043a\u0435\u0442 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <em>newoverflow<\/em> (\u043c\u0435\u0442\u043e\u0434 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f):<\/p>\n<pre><code class=\"go\">func (h *hmap) newoverflow(t *maptype, b *bmap) *bmap { var ovf *bmap ovf = (*bmap)(newobject(t.Bucket)) b.setoverflow(t, ovf) return ovf }  func (b *bmap) setoverflow(t *maptype, ovf *bmap) { *(**bmap)(add(unsafe.Pointer(b), uintptr(t.BucketSize)-goarch.PtrSize)) = ovf }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u0430\u043a\u0435\u0442\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0431\u0430\u0439\u0442 \u0445\u044d\u0448\u0430, key \u0438 value \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0442\u043e\u043c\u0443 \u0436\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443, \u0447\u0442\u043e \u0438 \u043f\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 (\u0448\u0430\u0433\u0435 6 \u0438 \u0434\u0430\u043b\u0435\u0435 \u0441\u043c. <strong>\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u043c\u0430\u043f\u0443<\/strong>).<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437 \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043d\u0430\u0439\u0442\u0438 \u0430\u0434\u0440\u0435\u0441 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0442\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u043c\u0443 \u0431\u0430\u043a\u0435\u0442\u0443, \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u0431\u0430\u043a\u0435\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0448\u0430\u0433\u0443 3. \u041d\u0430 \u043d\u0451\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0431\u0430\u043a\u0435\u0442, \u043f\u0435\u0440\u0435\u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>b=ovf<\/code> \u0438 \u0438\u0449\u0435\u043c \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u043c \u0431\u0430\u043a\u0435\u0442\u0435.<\/p>\n<h4>\u042d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u044f<\/h4>\n<p>\u041f\u0440\u0438 \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u0438 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0448\u0430\u0433\u0443 4. \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u044b\u043c, \u043a\u043e\u0433\u0434\u0430 \u043c\u0430\u043f\u0430 \u043d\u0435 \u044d\u0432\u0430\u043a\u0443\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u0438\u0437 \u0443\u0441\u043b\u043e\u0432\u0438\u0439: \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u0435\u0440\u043d\u043e, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>hashGrow(t, h)<\/em>, \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0451 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0430\u043f\u044b \u0438 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434 \u043d\u043e\u0432\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<pre><code class=\"go\">func hashGrow(t *maptype, h *hmap) { \/\/ ... more code oldbuckets := h.buckets newbuckets, nextOverflow := makeBucketArray(t, h.B+bigger, nil)  \/\/ ... more code  h.B += bigger h.flags = flags h.oldbuckets = oldbuckets h.buckets = newbuckets \/\/ ... more code }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 <em>hashGrow(t, h)<\/em> \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <em>goto again<\/em>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043d\u0430\u0441 \u0432 \u0431\u043b\u043e\u043a <em>again<\/em>. \u0417\u0434\u0435\u0441\u044c \u043d\u0430 \u0448\u0430\u0433\u0435 1 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0438\u0441\u0442\u0438\u043d\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0448\u0430\u0433\u0435 \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 <code>oldbuckets<\/code> \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0431\u0430\u043a\u0435\u0442.<\/p>\n<pre><code class=\"go\">func (h *hmap) growing() bool {    return h.oldbuckets != nil }<\/code><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>growWork_faststr(t, h, bucket)<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 \u0445\u044d\u0448\u0435\u0439, \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u043d\u043e\u0432\u044b\u0439 \u0431\u0430\u043a\u0435\u0442. \u0417\u0430 \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 <code>growWork_faststr<\/code> \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043e \u0434\u0432\u0443\u0445 \u0431\u0430\u043a\u0435\u0442\u043e\u0432. \u041e\u043d\u0438 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 overflow. \u042d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0439. \u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/948\/683\/589\/948683589bdcb2b5e85fe133c8033850.gif\" width=\"1600\" height=\"718\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/948\/683\/589\/948683589bdcb2b5e85fe133c8033850.gif\"\/><\/figure>\n<p>\u042d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u0447\u0438\u043d, \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043a\u043b\u044e\u0447\u0443 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0448\u0430 \u043f\u0430\u0440\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u043d\u0430 \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u043e\u0432\u043e\u043c \u0431\u0430\u043a\u0435\u0442\u0435, \u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0435\u0449\u0435 \u0432 \u0441\u0442\u0430\u0440\u043e\u043c. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c, \u0438 \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0435\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043d\u0430\u0448\u0435\u0439 \u043c\u0430\u043f\u0435.<\/p>\n<pre><code class=\"go\">myMap := make(map[string]string, 1000)<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043a\u0430\u0436\u0435\u0442\u0435, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u0430\u043f\u044b, \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u043e\u0434 \u044d\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0442\u043e\u0433\u0434\u0430 \u0432\u044b \u0438\u0437\u0431\u0435\u0436\u0438\u0442\u0435 \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u0438.<\/p>\n<h3>\u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043c\u0430\u043f\u044b<\/h3>\n<p>\u0412 Go \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<p><code>name := m[\"apple\"]<\/code><\/p>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>func mapaccess1_faststr(t *maptype, h *hmap, ky string) unsafe.Pointer<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0432 \u043c\u0430\u043f\u0435.<\/p>\n<p><code>name, ok := m[\"apple\"]<\/code><\/p>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>func mapaccess2_faststr(t *maptype, h *hmap, ky string) (unsafe.Pointer, bool)<\/code><\/p>\n<\/li>\n<\/ol>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440.<\/p>\n<pre><code class=\"go\">    func mapaccess1_faststr(t *maptype, h *hmap, ky string) unsafe.Pointer {         \/\/ ...more code 1    if h == nil || h.count == 0 {     return unsafe.Pointer(&amp;zeroVal[0])     }      \/\/ ...more code  2       key := stringStructOf(&amp;ky)         if h.B == 0 {             \/\/ ...more code     return unsafe.Pointer(&amp;zeroVal[0])         }     dohash: 3       hash := t.Hasher(noescape(unsafe.Pointer(&amp;ky)), uintptr(h.hash0))         m := bucketMask(h.B) 4       b := (*bmap)(add(h.buckets, (hash&amp;m)*uintptr(t.BucketSize))) 5       if c := h.oldbuckets; c != nil {     \/\/ ...more code             oldb := (*bmap)(add(c, (hash&amp;m)*uintptr(t.BucketSize)))     if !evacuated(oldb) {     b = oldb     }     }     top := tophash(hash) 6       for ; b != nil; b = b.overflow(t) {     for i, kptr := uintptr(0), b.keys(); i &lt; bucketCnt; i, kptr = i+1, add(kptr, 2*goarch.PtrSize) { 7    k := (*stringStruct)(kptr)     if k.len != key.len || b.tophash[i] != top {     continue     }     if k.str == key.str || memequal(k.str, key.str, uintptr(key.len)) {     return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*goarch.PtrSize+i*uintptr(t.ValueSize))     }     }     } 8       return unsafe.Pointer(&amp;zeroVal[0])     }<\/code><\/pre>\n<p>\u041d\u0430 \u0448\u0430\u0433\u0435 1 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043b\u0438 \u0445\u044d\u0448\u043c\u0430\u043f\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u0438 \u043e\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u0438. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0438\u043f\u0430.<\/p>\n<p>\u041d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043b\u044e\u0447\u0430. \u041a\u0430\u043a \u043e\u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <em>assign<\/em>. \u0417\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0430\u043a\u0435\u0442\u043e\u0432. \u0415\u0441\u043b\u0438 h.B = 0, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 1 \u0431\u0430\u043a\u0435\u0442 (\u043f\u043e\u043c\u043d\u0438\u043c \u043f\u0440\u043e \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c). \u0415\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u0435\u0440\u043d\u043e, \u0438\u0449\u0435\u043c \u043a\u043b\u044e\u0447 \u0432 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0431\u0430\u043a\u0435\u0442\u0435. \u0415\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0438\u043f\u0430.\u00a0<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0434\u0432\u0443\u043c \u0431\u0430\u043a\u0435\u0442\u0430\u043c.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0431\u0430\u043a\u0435\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <em>h.B = 1<\/em>. \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043a\u043b\u044e\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0431\u0430\u043a\u0435\u0442\u0435 \u0438 \u0438\u0445 \u0445\u044d\u0448:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"113\" width=\"113\">\n<p align=\"left\">Bucket 0<\/p>\n<\/td>\n<td data-colwidth=\"213\" width=\"213\">\n<p align=\"left\">\n<\/td>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">Bucket 1<\/p>\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"113\" width=\"113\">\n<p align=\"left\">key<\/p>\n<\/td>\n<td data-colwidth=\"213\" width=\"213\">\n<p align=\"left\">hash<\/p>\n<\/td>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">key<\/p>\n<\/td>\n<td>\n<p align=\"left\">hash<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"113\" width=\"113\">\n<p align=\"left\">&#171;apple 0&#187;<\/p>\n<\/td>\n<td data-colwidth=\"213\" width=\"213\">\n<p align=\"left\">18181302390444278678<\/p>\n<\/td>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">&#171;apple 1&#187;<\/p>\n<\/td>\n<td>\n<p align=\"left\">11280555957917037065<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"113\" width=\"113\">\n<p align=\"left\">&#171;apple 4&#187;<\/p>\n<\/td>\n<td data-colwidth=\"213\" width=\"213\">\n<p align=\"left\">16499847109860801832<\/p>\n<\/td>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">&#171;apple 2&#187;<\/p>\n<\/td>\n<td>\n<p align=\"left\">17367488952475712717<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"113\" width=\"113\">\n<p align=\"left\">&#171;apple 5&#187;<\/p>\n<\/td>\n<td data-colwidth=\"213\" width=\"213\">\n<p align=\"left\">10456081677947574620<\/p>\n<\/td>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">&#171;apple 3&#187;<\/p>\n<\/td>\n<td>\n<p align=\"left\">13693750386711854567<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"113\" width=\"113\">\n<p align=\"left\">&#171;apple 6&#187;<\/p>\n<\/td>\n<td data-colwidth=\"213\" width=\"213\">\n<p align=\"left\">12140854452082777592<\/p>\n<\/td>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">&#171;apple 7&#187;<\/p>\n<\/td>\n<td>\n<p align=\"left\">7760656414049467263<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"113\" width=\"113\">\n<p align=\"left\">&#171;apple 9&#187;<\/p>\n<\/td>\n<td data-colwidth=\"213\" width=\"213\">\n<p align=\"left\">7829506238846544754<\/p>\n<\/td>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">&#171;apple 8&#187;<\/p>\n<\/td>\n<td>\n<p align=\"left\">16674080395332218175<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"113\" width=\"113\">\n<p align=\"left\">&#171;apple 10&#187;<\/p>\n<\/td>\n<td data-colwidth=\"213\" width=\"213\">\n<p align=\"left\">3232182299567472732<\/p>\n<\/td>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"113\" width=\"113\">\n<p align=\"left\">&#171;apple 11&#187;<\/p>\n<\/td>\n<td data-colwidth=\"213\" width=\"213\">\n<p align=\"left\">11891753136885307068<\/p>\n<\/td>\n<td data-colwidth=\"93\" width=\"93\">\n<p align=\"left\">\n<\/td>\n<td>\n<p align=\"left\">\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u043b\u044e\u0447\u0443 &#171;apple 7&#187;:<\/p>\n<p><code>\u0430 := ourMap[\"apple 7\"]<\/code><\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0448\u0430\u0433\u0430 3. \u0422\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u0430\u043a \u0438 \u043f\u0440\u0438 <em>assign\u2019<\/em>\u0435, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0445\u044d\u0448 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430. \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0431\u0438\u0442\u043e\u0432\u043e\u0439 \u043c\u0430\u0441\u043a\u0435 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u0438 <em>assign<\/em>):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\text {bucketMask(h.B) = bucketMask(1) = 1}\" alt=\"\\text {bucketMask(h.B) = bucketMask(1) = 1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ae5\/f3e\/8df\/ae5f3e8df61dda94edde5cf7cd6bf2a9.svg\" width=\"336\" height=\"22\"\/><\/p>\n<p>\u041d\u0430 \u0448\u0430\u0433\u0435 4 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0431\u0438\u0442\u043e\u0432\u043e\u0439 \u043c\u0430\u0441\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u0432 \u043a\u0430\u043a\u043e\u043c \u0431\u0430\u043a\u0435\u0442\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u0448 \u0445\u044d\u0448.<\/p>\n<p><code>m=1 , t.BucketSize=272 , h.buckets=1000 , hash<\/code> \u0434\u043b\u044f \u201capple 7\u201d = 7760656414049467263.<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u0447\u0438\u0441\u043b\u043e 7760656414049467263 \u043a \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 110101110110011011000111110010000001111010001100111101101111111.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441 1 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e \u0418: 110101110110011011000111110010000001111010001100111101101111111 &amp; 1.<br \/>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0432\u0435\u043d 1. <code>hash&amp;m<\/code> = 1.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430. \u041d\u043e \u0437\u043d\u0430\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0432\u0441\u0435\u0445 \u0431\u0430\u043a\u0435\u0442\u043e\u0432, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u043d\u0443\u0436\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443. \u041d\u0443\u0436\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u043a\u0435\u0442\u043e\u0432, \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0431\u0430\u043a\u0435\u0442 \u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (\u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432):<\/p>\n<\/li>\n<\/ol>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\text {b = (*bmap)(add(h.buckets, (hash&amp;m})\\cdot \\text{uintptr(t.BucketSize)))} =\\\\ =\u00a0 \\text {h.buckets + (hash&amp;m)} \\cdot \\text {t.BucketSize } =\\\\ = \\text {1000 + 1} \\cdot \\text {272 = 1272}\\\\\" alt=\"\\text {b = (*bmap)(add(h.buckets, (hash&amp;m})\\cdot \\text{uintptr(t.BucketSize)))} =\\\\ =\u00a0 \\text {h.buckets + (hash&amp;m)} \\cdot \\text {t.BucketSize } =\\\\ = \\text {1000 + 1} \\cdot \\text {272 = 1272}\\\\\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/903\/af0\/e80\/903af0e8062a1b4d714db9104bc0c282.svg\" width=\"697\" height=\"96\"\/><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430, \u043d\u0430 \u0448\u0430\u0433\u0435 5 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0431\u0430\u043a\u0435\u0442\u044b, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0430 \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u044f. \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c <em>h.oldbuckets<\/em> \u2014 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u044f \u043c\u0430\u043f\u044b = \u0432\u0441\u0435\u0445 \u0441\u0442\u0430\u0440\u044b\u0445 \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430. \u0422\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044d\u0432\u0430\u043a\u0443\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043b\u0438 \u0431\u0430\u043a\u0435\u0442, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0448\u0430\u0433\u0435. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u043d\u0435\u043c\u0443.<\/p>\n<p>\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0448\u0430\u0433\u0435 \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0431\u0430\u0439\u0442 \u0445\u044d\u0448\u0430. \u042d\u0442\u043e \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0431\u0430\u043a\u0435\u0442\u0443 \u0438 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u2014 \u0435\u0449\u0451 \u0438 \u043f\u043e \u043d\u0438\u043c:<\/p>\n<pre><code class=\"go\">for i, kptr := uintptr(0), b.keys(); i &lt; bucketCnt; i, kptr = i+1, add(kptr, 2*goarch.PtrSize) { \/\/ ...more code }<\/code><\/pre>\n<p>\u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439:<\/p>\n<pre><code class=\"go\">kptr := b.keys() for i := uintptr(0); i &lt; bucketCnt; i = i+1 { \/\/ ...more code kptr = add(kptr, 2*goarch.PtrSize) }<\/code><\/pre>\n<p><code>b.key()<\/code> \u2014 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u043f\u0430\u0440. \u0410\u0434\u0440\u0435\u0441 \u043a\u043b\u044e\u0447\u0435\u0439 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430. \u0415\u0441\u043b\u0438 \u0431\u0430\u043a\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u044f\u0447\u0435\u0439\u043a\u0438 1000, \u0442\u043e b.key() \u0432\u0435\u0440\u043d\u0435\u0442 1008, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u0432\u0435\u0440\u0445\u043d\u0438\u0435 \u0431\u0430\u0439\u0442\u044b \u0445\u044d\u0448\u043e\u0432.<\/p>\n<p><code>kptr = add(kptr, 2goarch.PtrSize)<\/code><em> \u2014 <\/em>\u0441\u0434\u0432\u0438\u0433 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043b\u044e\u0447<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"\\text {add(kptr, 2}\\cdot\\text{goarch.PtrSize) = kptr + 2} \\cdot \\text{8 = kptr + 16}\" alt=\"\\text {add(kptr, 2}\\cdot\\text{goarch.PtrSize) = kptr + 2} \\cdot \\text{8 = kptr + 16}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bd9\/eda\/44c\/bd9eda44c669c017b88e56655b1d6dfd.svg\" width=\"468\" height=\"22\"\/><\/p>\n<p>\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u044d\u0442\u043e\u0442 \u0446\u0438\u043a\u043b \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0443 \u0432\u0441\u0435\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 \u0432 \u0431\u0430\u043a\u0435\u0442\u0435.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u0446\u0438\u043a\u043b\u0430 \u043c\u044b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u043a\u043b\u044e\u0447\u0430 \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 (\u0448\u0430\u0433 7). \u0417\u0430\u0442\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0434\u043b\u0438\u043d\u0443 \u043a\u043b\u044e\u0447\u0430, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0449\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0441 \u0434\u043b\u0438\u043d\u043e\u0439 \u043a\u043b\u044e\u0447\u0430 \u0438\u0437 \u0431\u0430\u043a\u0435\u0442\u0430, \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u0442\u043e\u043f \u0445\u044d\u0448\u0438.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043b\u0438\u0431\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 \u0438\u0437 \u0431\u0430\u043a\u0435\u0442\u0430 \u0438\u043b\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430. \u0415\u0441\u043b\u0438 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043d\u0435 \u043d\u0430\u0448\u0451\u043b\u0441\u044f, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0438\u043f\u0430 (\u0448\u0430\u0433 8).<\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434\u00a0<\/h3>\n<p>\u041c\u044b \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u0445 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043c\u0430\u043f\u044b \u0432 Go. \u0418\u0437\u0443\u0447\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043c\u0430\u043f\u044b, \u043e\u0431\u0441\u0443\u0434\u0438\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0434\u0430\u0436\u0435 \u0434\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0442\u043e\u0432. \u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043c\u0430\u043f\u044b \u0438 \u043f\u043e\u043d\u044f\u043b\u0438, \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043a\u043b\u044e\u0447\u0443 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443.<\/p>\n<p>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f: <a href=\"https:\/\/habr.com\/ru\/companies\/avito\/articles\/775922\/\"><em>\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u043c High Availability PostgreSQL<\/em><\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/774618\/\"> https:\/\/habr.com\/ru\/articles\/774618\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u043c\u0438\u0440\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445: \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0438\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438; \u0438 \u043c\u0430\u043f\u044b \u2014 \u0441\u043b\u043e\u0432\u0430\u0440\u0438 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043c\u0430\u043f\u044b \u0432 \u044f\u0437\u044b\u043a\u0435 Go \u0438 \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u043a\u043e\u0434\u0435. \u041c\u0430\u043f\u0430 \u0432 Go \u2014 \u044d\u0442\u043e \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440 \u00ab\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb.<\/p>\n<figure class=\"full-width\"><\/figure>\n<h3>\u0422\u0435\u043e\u0440\u0438\u044f \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446<\/h3>\n<p>\u0425\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u044b \u00ab\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u0440\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:\u00a0<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u0438\u0441\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u043a\u043b\u044e\u0447\u0443,\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u044b,<\/p>\n<\/li>\n<li>\n<p>\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u044b.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0425\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0417\u0430\u0442\u0435\u043c \u043e\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0442\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0435.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u044b, \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043c\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043b\u044e\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441, \u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043f\u0430\u0440\u0443.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a \u0434\u0432\u0443\u043c \u0440\u0430\u0437\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u0430\u043c, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0438\u043d\u0434\u0435\u043a\u0441. \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0435\u0439. \u0415\u0451 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0446\u0435\u043f\u043e\u0447\u0435\u043a<\/p>\n<p>\u041f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u043c\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u043a\u043b\u044e\u0447 \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0437\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438\u043b\u0438 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u043d\u0430\u0434\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0451, \u043d\u043e \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e \u043d\u0435\u0439 \u043f\u043e\u0438\u0441\u043a. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0447\u0442\u043e \u0438 \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435, \u0438 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u0441\u043a\u043e\u043c\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0438\u043b\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043d\u043e\u0432\u044b\u0439. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0438 \u043d\u043e\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0445\u044d\u0448\u0430\u043c\u0438\u00a0(\u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a).<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043b\u043e\u0445\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0445\u044d\u0448\u0438, \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u00ab\u043c\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0438 N \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u044f\u0447\u0435\u0439\u043a\u0443, \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u043e\u0439 N\u00bb. \u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0442\u0430\u043a\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(N), \u0430 \u044d\u0442\u043e \u043d\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435, \u0447\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443.<\/p>\n<p>\u0412 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043d\u0430\u043c \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043d\u0430\u0448\u0435\u0439 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u2014 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435, \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u0432\u0430\u0440 \u0432 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0443: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0440\u0443\u043a\u0442\u044b \u0438\u043b\u0438 \u043e\u0432\u043e\u0449\u0438. \u0422\u043e\u0433\u0434\u0430 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u00ab\u0431\u0430\u043a\u0435\u0442\u044b\u00bb \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 10 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0431\u0430\u043a\u0435\u0442\u0435 \u0441 \u0444\u0440\u0443\u043a\u0442\u0430\u043c\u0438 \u0438 10 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0431\u0430\u043a\u0435\u0442\u0435 \u0441 \u043e\u0432\u043e\u0449\u0430\u043c\u0438.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u2014 \u0444\u0440\u0443\u043a\u0442 \u0438\u043b\u0438 \u043e\u0432\u043e\u0449. \u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c 10 \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0439. \u0422\u0430\u043a \u043c\u044b \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430, \u043d\u043e \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u0430\u043a\u0435\u0442\u0430 \u043d\u0435 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438.<\/p>\n<p>\u0415\u0449\u0451 \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0435. \u0415\u0441\u043b\u0438 \u0435\u0451 \u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c, \u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0438 \u043f\u043e\u0438\u0441\u043a \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c. \u0427\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0440\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043a\u0435\u0442\u043e\u0432, \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u043b\u0438 load factor.<\/p>\n<p><strong>\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u043b\u0438 load factor <\/strong>\u2014 \u044d\u0442\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0430\u0440 \u00ab\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb \u043a \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u044e\u0442 \u043f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0442\u043e \u0445\u044d\u0448-\u043c\u0430\u043f\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044e\u0442, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u0430\u0440 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442 \u0438 \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442.<\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f map \u0432 Go 1.21.1<\/h3>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u044f \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u0435\u043b\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0431\u043b\u043e\u043a\u0430\u043c. \u0412\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>goarch.PtrSize=8<\/code>.<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0430\u043f\u043e\u0439:<\/p>\n<pre><code class=\"go\">\/\/ go\/src\/runtime\/map.go  type hmap struct {   \/\/ ...more code   count       int   B           uint 8   noverflow   uint 16   hash0       uint 32   buckets     unsafe.Pointer   oldbuckets  unsafe.Pointer }<\/code><\/pre>\n<p><strong>count <\/strong>\u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440 \u00ab\u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb.<\/p>\n<p><strong>B<\/strong> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043a\u0435\u0442\u043e\u0432, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u0435 \u0447\u0435\u0440\u0435\u0437 log<sub>2<\/sub>. \u0422\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u0438\u0442\u043e\u0432\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p><strong>noverflow<\/strong> \u2014 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0431\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p><strong>hash0 <\/strong>\u2014 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u0438 \u0432 \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043a \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f\u043c.<\/p>\n<p><strong>buckets<\/strong> \u2014 \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u043a\u0435\u0442\u043e\u0432. \u0412 Go \u044d\u0442\u043e \u044f\u0447\u0435\u0439\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0431\u0430\u043a\u0435\u0442\u044b.<\/p>\n<p><strong>oldbuckets<\/strong> \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u043a\u0435\u0442\u043e\u0432, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u044d\u0432\u0430\u043a\u0443\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0433\u0434\u0430 \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435. \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044f\u0447\u0435\u0439\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<pre><code class=\"go\">\/\/ go\/src\/runtime\/type.go  type MapType struct {   \/\/ ...more code   Hasher     func(unsafe.Pointer, uintptr) uintptr }<\/code><\/pre>\n<p><strong>Hasher<\/strong> \u2014 \u044d\u0442\u043e \u0445\u044d\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b key, hash0 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 hash. \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"go\">hash := t.Hasher(noescape(unsafe.Pointer(&amp;s)), uintptr(h.hash0))<\/code><\/pre>\n<pre><code class=\"go\">\/\/go\/src\/runtime\/map.go  type bmap struct {   \/\/ tophash generally contains the top byte of the hash value   \/\/ for each key in this bucket.   tophash [bucketCnt]uint8 }<\/code><\/pre>\n<p><strong>tophash<\/strong> \u2014 \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 8 \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0431\u0430\u0439\u0442 \u0445\u044d\u0448\u0435\u0439 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0432 \u0431\u0430\u043a\u0435\u0442\u0435.<\/p>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0431\u0430\u043a\u0435\u0442\u0435 \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0432\u0430\u0436\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442<\/p>\n<pre><code class=\"go\">const bucketCnt = 8<\/code><\/pre>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0430\u043f\u044b<\/h3>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441 \u0442\u0438\u043f\u043e\u043c <code>map[string]string<\/code> \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ol>\n<li>\n<p><code>var m map[string]string<\/code><\/p>\n<\/li>\n<li>\n<p><code>m := make(map[string]string)<\/code><\/p>\n<\/li>\n<\/ol>\n<p>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0442\u043e\u043c,\u0447\u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>make<\/code> \u043c\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0438 <code>hmap<\/code>.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 map \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>make<\/code>. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 map \u0447\u0435\u0440\u0435\u0437 make \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>makemap<\/code>.<\/p>\n<pre><code class=\"go\">  func makemap(t *maptype, hint int, h *hmap) *hmap {     \/\/...more code  1   \/\/ initialize Hmap     if h == nil {       h = new(hmap)     }     h.hash0 = fastrand()  2   B := uint8(0)     for overLoadFactor(hint, B) {       B++     }     h.B = B  3   if h.B != 0 {       var nextOverflow *bmap       h.buckets, nextOverflow = makeBucketArray(t, h.B, nil)       \/\/...more code     }      return h   }<\/code><\/pre>\n<p><strong>\u0411\u043b\u043e\u043a 1.<\/strong> \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 <code>h *hmap<\/code>. \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0435\u0442, \u0442\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c. \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c hash0.<\/p>\n<p><strong>\u0411\u043b\u043e\u043a 2.<\/strong> \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043a\u0435\u0442\u043e\u0432 <em>B<\/em> \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <em>log<\/em> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 <code>hint<\/code>. <code>hint<\/code> \u2014 \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>make(map[string]string, hint)<\/code>.<\/p>\n<p><strong>\u0411\u043b\u043e\u043a 3.<\/strong> \u0415\u0441\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0435 \u0440\u0430\u0432\u043d\u043e 1 (<em>log 1 = 0 = B<\/em>), \u0442\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0431\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<h3>\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u043c\u0430\u043f\u0443<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0432 \u043c\u0430\u043f\u0443 \u043f\u0435\u0440\u0432\u0443\u044e \u043f\u0430\u0440\u0443:<\/p>\n<pre><code class=\"go\">m[\"apple\"] = \"fruit\"<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043c\u0430\u043f\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 (\u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a\u0438):<\/p>\n<pre><code class=\"go\">  func mapassign_faststr(t *maptype, h *hmap, s string) unsafe.Pointer { 1     if h == nil {          panic(plainError(\"assignment to entry in nil map\"))        }        \/\/ ...more code  2     key := stringStructOf(&amp;s)  3     hash := t.Hasher(noescape(unsafe.Pointer(&amp;s)), uintptr(h.hash0))         \/\/ ...more code        if h.buckets == nil {          h.buckets = newobject(t.Bucket) \/\/ newarray(t.bucket, 1)        }        \/\/ ...more code    }<\/code><\/pre>\n<p><strong>\u0428\u0430\u0433 1.<\/strong> \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0431\u044b\u043b\u0430 \u043b\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430\u0448\u0430 <code>hmap<\/code>. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u043d\u0438\u043a\u0443. \u0427\u0430\u0441\u0442\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u2014 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>make<\/code> \u0438 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043d\u0435\u0451 \u043a\u043b\u044e\u0447\/\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p><strong>\u0428\u0430\u0433 2.<\/strong> \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>key<\/code> \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441 \u043a\u043b\u044e\u0447\u0430 &#171;apple&#187;.<\/p>\n<pre><code class=\"go\">\/\/ go\/SDK\/cmd\/runtime\/string.go  type stringStruct struct {    str unsafe.Pointer    len int  }   func stringStructOf(sp *string) *stringStruct {    return (*stringStruct) (unsafe.Pointer(sp))  }<\/code><\/pre>\n<p><code>unsafe.Pointer<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430.<\/p>\n<p><strong>\u0428\u0430\u0433 3.<\/strong> \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c hash \u043a\u043b\u044e\u0447\u0430 &#171;apple&#187; \u0438 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u0432 <code>makemap<\/code>.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043b\u0435\u0439\u0431\u043b\u0430 goto \u2014 <code>again<\/code>.<\/p>\n<pre><code class=\"go\">  func mapassign_faststr(t *maptype, h *hmap, s string) unsafe Pointer {     \/\/ ...more code     again:  1   bucket := hash &amp; bucketMask(h. B)      \/\/ ...more code  2   b := (*bmap) (add(h.buckets, bucket*uintptr(t.BucketSize)))  3   top := tophash(hash)   4   var insertb *bmap      var inserti uintptr      var insertk unsafe.Pointer       \/\/ ...more code  }<\/code><\/pre>\n<p><strong>\u0428\u0430\u0433 1.<\/strong> \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0431\u0430\u043a\u0435\u0442 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u043b\u0435\u0436\u0430\u0442 \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"go\">\/\/ bucketMask returns 1&lt;&lt;b - 1, optimized for code generation.  func bucketMask(b uint8) uintptr {    return bucketShift(b) - 1 }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>1 &lt;&lt; b - 1<\/code>.<\/p>\n<p>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>&lt;&lt;<\/code> \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u0432\u043b\u0435\u0432\u043e. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>5 &lt;&lt; 3.<\/code> \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0447\u0438\u0441\u043b\u043e 5 \u043d\u0430 3 \u0431\u0438\u0442\u0430 \u0432\u043b\u0435\u0432\u043e. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0438\u0441\u043b\u043e <code>5<\/code> \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>101<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u0434\u0432\u0438\u0433 <code>101<\/code> \u043d\u0430 <code>3<\/code> \u0431\u0438\u0442\u0430 \u0432\u043b\u0435\u0432\u043e \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>101000<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e <code>101000<\/code> \u0432 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>40<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430 (<em>log 1 = 0 = b<\/em>), \u0440\u0430\u0441\u0447\u0451\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p><code>1<\/code> \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0440\u0430\u0432\u043d\u043e <code>1<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u0434\u0432\u0438\u0433 <code>1<\/code> \u043d\u0430 <code>0<\/code> \u0431\u0438\u0442 \u0432\u043b\u0435\u0432\u043e \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>1<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0447\u0438\u0442\u0430\u0435\u043c <code>1<\/code> \u0438\u0437 <code>1<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>0<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043b\u0438 <code>bucketMask(h.B) = bucketMask(0) = 0<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a <code>bucket := hash &amp; bucketMask(h.B)<\/code>. \u0417\u0434\u0435\u0441\u044c <code>&amp;<\/code> \u2014 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0418. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <code>5 &amp; 3<\/code>.<\/p>\n<ul>\n<li>\n<p><code>5<\/code> \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0440\u0430\u0432\u043d\u043e <code>101<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>3<\/code> \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0440\u0430\u0432\u043d\u043e <code>011<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e <code>101 &amp; 011<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>001<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0432\u043e\u0434\u0438\u043c <code>001<\/code> \u043a \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>1<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f &#171;apple&#187; <code>hash = 15088695172686704874<\/code>, \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430 <code>bucketMask(0) = 0<\/code>, \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u0447\u0442\u043e <code>bucket = 15088695172686704874 &amp; 0 = 0<\/code> \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>bucket=0<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0431\u0430\u043a\u0435\u0442 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043f\u0430\u0440\u0443.<\/p>\n<p><strong>\u0428\u0430\u0433 2.<\/strong> \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e <code>*bmap<\/code>.<\/p>\n<p><code>h.buckets<\/code> \u2014 \u044d\u0442\u043e \u044f\u0447\u0435\u0439\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0431\u0430\u043a\u0435\u0442.<\/p>\n<p><code>bucket<\/code> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u0431\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p><code>t.BucketSize=272<\/code> \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u043a\u0435\u0442\u0430 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>add<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u043e\u0432.<\/p>\n<pre><code class=\"go\">\/\/ runtime\/stubs.go  func add(p unsafe.Pointer, x uintptr) unsafe.Pointer {    return unsafe.Pointer(uintptr(p) + x)  }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u044f\u0447\u0435\u0439\u043a\u0443 \u043f\u0430\u043c\u044f\u0442\u0438. \u0412 \u043d\u0435\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 \u0445\u044d\u0448\u0430 \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p><strong>\u0428\u0430\u0433 3.<\/strong> \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0431\u0430\u0439\u0442 \u043f\u043e hash \u043e\u0442 &#171;apple&#187;.<\/p>\n<pre><code class=\"go\">func tophash(hash uintptr) uint8 {   top := uint8(hash >> (goarch.PtrSize*8 - 8))   if top &lt; minTopHash { \/\/ minTopHash = 5      top += minTopHash   }   return top }<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 <code>tophash<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u043a\u043b\u044e\u0447\u0430 &#171;apple&#187; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>hash=3661323553996174279<\/code>, \u0430 <code>goarch.PtrSize<\/code> \u0440\u0430\u0432\u043d\u043e 8 \u0434\u043b\u044f 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<p>>(8\\cdot8\u22128) \\\\ 3661323553996174279>>(64\u22128) \\\\ 3661323553996174279>>56&#8243;<\/p><\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-360447","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/360447","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=360447"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/360447\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=360447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=360447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=360447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}