{"id":1506,"date":"2024-10-09T11:38:11","date_gmt":"2024-10-09T03:38:11","guid":{"rendered":"https:\/\/www.madbull.site\/?p=1506"},"modified":"2024-10-10T14:45:33","modified_gmt":"2024-10-10T06:45:33","slug":"%e7%ba%a2%e9%bb%91%e6%a0%91-libhl%e5%ba%93%e7%9a%84%e4%bd%bf%e7%94%a8%ef%bc%88%e4%ba%8c%ef%bc%89","status":"publish","type":"post","link":"https:\/\/www.madbull.site\/?p=1506","title":{"rendered":"\u7ea2\u9ed1\u6811&#8212;libhl\u5e93\u7684\u4f7f\u7528\uff08\u4e8c\uff09"},"content":{"rendered":"\n<p>\u672c\u6b21\u793a\u4f8b\u662f\u7ea2\u9ed1\u6811\u4f7f\u7528\u6d4b\u8bd5\u3002<\/p>\n\n\n\n<p>libhl\u5f00\u6e90\u5e93\u7f16\u8bd1\u5b89\u88c5\u8fc7\u7a0b\uff0c\u53c2\u770b\u5f80\u671f\u6587\u7ae0\uff1a<a href=\"https:\/\/www.madbull.site\/?p=897\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.madbull.site\/?p=897<\/a>\u00a0C\u8bed\u8a00\u5b9e\u73b0\u57fa\u7840\u6570\u636e\u7ed3\u6784\u5e93<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-accent-3-color\"><strong>\u6ce8\u610f\uff1a<\/strong><\/mark>\u6b64\u7ea2\u9ed1\u6811 <strong>\u4e0d\u662f\u7ebf\u7a0b\u5b89\u5168\u7684<\/strong>\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u6240\u4ee5\u5728\u591a\u7ebf\u7a0b\u4f7f\u7528\u65f6\uff0c\u5982\u679c\u540c\u65f6\u6d89\u53ca\u8bfb\u5199\uff0c\u5219\u9700\u8981\u4e0a\u9501\u6216\u8005\u901a\u8fc7\u65e0\u9501\u7f16\u7a0b\u5b9e\u73b0\u4e92\u65a5\u8bbf\u95ee\uff1b<\/p>\n\n\n\n<p>\u5982\u679c\u628a\u6570\u636e\u4e00\u6b21\u6027\u4e14\u662f\u5355\u7ebf\u7a0b\u52a0\u8f7d\u5230\u7ea2\u9ed1\u6811\u4e2d\uff0c\u7136\u540e\u4e0d\u518d\u4fee\u6539\uff0c\u6b64\u540e\u53ea\u8bfb\u53d6\u6570\u636e\uff0c\u5219\u4e0d\u7528\u8003\u8651\u4e92\u65a5\u7684\u95ee\u9898\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>\u6d4b\u8bd5\u4ee3\u7801<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-medium-font-size\">\u793a\u4f8b\u628a \/etc\/os-release \u6587\u4ef6\u6bcf\u4e00\u884c\u53bb\u6389\u6362\u884c\u7b26 \\n \u540e\uff0c\u8ba1\u7b97\u54c8\u5e0c\u503c\uff0c\u6bcf\u4e00\u884c\u6570\u636e\u5199\u5165\u5230\u7ea2\u9ed1\u6811\u4e2d\uff0c\u6d89\u53ca\u5230 <strong>\u7ea2\u9ed1\u6811\u521b\u5efa\u3001\u6570\u636e\u589e\u52a0\u3001\u6570\u636e\u67e5\u8be2\u3001\u6570\u636e\u5220\u9664\u3001\u7ea2\u9ed1\u6811\u904d\u5386<\/strong>\u548c<strong>\u7ea2\u9ed1\u6811\u9500\u6bc1\u64cd\u4f5c<\/strong>\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u672c\u6587\u5bf9\u6570\u636e\u505a\u54c8\u5e0c\u7b97\u6cd5\u4f7f\u7528\u7684 cityhash\uff0c\u5177\u4f53\u7528\u6cd5\u53c2\u770b\u5f80\u671f\u6587\u7ae0\uff1a<a href=\"https:\/\/www.madbull.site\/?p=1322\">https:\/\/www.madbull.site\/?p=1322<\/a> cityhash&#8211;\u5bf9\u5b57\u7b26\u4e32\u7684\u54c8\u5e0c\u7b97\u6cd5<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u521b\u5efa.c\u6587\u4ef6 rbttst.c\uff0c\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ gcc -Wall -o rbttst rbttst.c -lhl -lcityhash\n\n#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;string.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;fcntl.h&gt;\n\n#include \"cityhash.h\"\n#include \"rbtree.h\"\n#include \"comparators.h\"\n\nconst char * filepath = \"\/etc\/os-release\" ;\n\n\/\/ \u5bf9\u6570\u636e \u8ba1\u7b97\u54c8\u5e0c\u503c \u4f5c\u4e3akey\uff0c\u628a\u5bf9\u5e94\u7684 data \u5b58\u5165\u5230 rbt \u7684\u4e00\u4e2a\u8282\u70b9\u4e2d\u3002\nint rbt_add_data( char * data, size_t data_size, rbt_t * rbt_p ) {\n\n    uint64 key = CityHash64(data, data_size);\n\n    \/\/ 1\u3001key \u7684\u7a7a\u95f4\u4e0d\u9700\u8981\u4fdd\u7559\uff0crbt_add\u4e0d\u9700\u8981key\u7684\u7a7a\u95f4\n    \/\/ 2\u3001data \u7684\u7a7a\u95f4\u9700\u8981\u4fdd\u7559\uff0cdata\u6307\u9488\u76f4\u63a5\u8d4b\u503c\u7ed9\u4e86 rbt_node_t \u7ed3\u6784\u7684 void *value \u5b57\u6bb5\n    \/\/ 3\u3001\u5982\u679c key \u5df2\u7ecf\u5b58\u5728\uff0c\u5219\u81ea\u52a8\u5220\u9664 rbt \u91cc\u7684\u65e7\u6570\u636e\uff0c\u628a\u65b0\u6570\u636e\u91cd\u65b0\u52a0\u5165\u5230 rbt \u4e2d\n    rbt_add(rbt_p, &amp;key, sizeof(uint64), data);\n    return 0 ;\n}\n\n\/\/ \u5bf9\u6570\u636e \u8ba1\u7b97\u54c8\u5e0c\u503c \u4f5c\u4e3akey\uff0c\u5e76\u5220\u9664\u6b64\u8282\u70b9\nint rbt_del_data( char * data, size_t data_size, rbt_t * rbt_p ) {\n    \/\/ void * value = NULL ; \/\/ \u63a5\u6536\u5220\u9664\u8282\u70b9\u7684 value \u6307\u9488\u6307\u5411\u7684\u7a7a\u95f4\n\n    \/\/ \u8ba1\u7b97 key \n    uint64 key = CityHash64(data, data_size);\n\n    \/\/  \u4ece rbt \u7ea2\u9ed1\u6811\u91cc\u67e5\u8be2\u5230 key \u4e4b\u540e\uff0c\u518d\u5220\u9664\u6b64\u6570\u636e\u3002 \n    \/\/ \u5982\u679c void ** value \u53c2\u6570\u7ed9\u7684\u662fNULL\uff0c\u5219\u4f1a\u81ea\u52a8\u8c03\u7528 \u5185\u5b58\u91ca\u653e\u51fd\u6570\uff0c\u91ca\u653e rbt_node_t \u4e2d\u5b58\u503c\u7684\u7a7a\u95f4\u3002\n    \/\/ \u5426\u5219\uff0c\u4f1a\u628a rbt_node_t \u4e2dvalue\u6307\u5411\u7684\u7a7a\u95f4\u5730\u5740\uff0c\u8d4b\u503c\u7ed9value\u6307\u9488\uff0c\n    int ret = rbt_remove(rbt_p, &amp;key, sizeof(uint64), NULL);\n    if ( ret == 0 ) {\n        printf(\"%s:%s : remove node key&#91;%lu] value&#91;%s]\\n\", __FILE__, __func__, key, data) ;\n    } else {\n        fprintf(stderr, \"%s:%s : can not find key&#91;%lu] value&#91;%s]\\n\", __FILE__, __func__, key, data) ;\n    }\n    return ret ;\n}\n\n\/\/ \u4ece\u6587\u4ef6\u4e2d\u8bfb\u53d6\u6570\u636e\uff0c\u6bcf\u4e00\u884c\u6761\u6570\u636e\uff0c\u5b58\u5165\u5230 rbt--\u7ea2\u9ed1\u6811\u4e2d\nint file_to_rbt(const char * filepath, rbt_t * rbt_p ) {\n    FILE * fd = NULL ;\n    char read_buf&#91;2048] ;\n    char * data = NULL ; \n    size_t data_len = 0 ;\n\n    \/\/ 1\u3001 \u6253\u5f00\u6587\u4ef6\n    fd = fopen( filepath, \"r\") ;\n    if ( fd == NULL ) {\n        fprintf(stderr, \"%s:%s : open file &#91;%s] error !\", __FILE__, __func__, filepath) ;\n        return -1 ;\n    }\n\n    \/\/ 2\u3001\u9010\u884c\u8bfb\u53d6\u6570\u636e\uff0c\u5e76\u52a0\u5165\u5230 rbt \u7ea2\u9ed1\u6811\u4e2d\u3002\n    memset(read_buf, 0x00, sizeof(read_buf) ) ;\n    while (fgets(read_buf, sizeof(read_buf), fd) != NULL ) {\n\n        \/\/ \u8ba1\u7b97\u957f\u5ea6\n        data_len = strlen(read_buf) ;\n        \/\/  \u5904\u7406\u6362\u884c\u7b26\u53f7\n        if ( '\\n' == read_buf&#91;data_len-1] ) {\n            read_buf&#91;data_len-1] = '\\0' ;\n        }\n        \/\/ \u521b\u5efa rbt_node_t \u7ed3\u6784\u4e2d value \u6307\u9488\u6307\u5411\u7684\u6570\u636e\n        data = (char *)calloc(1, data_len) ; \n        memcpy(data, read_buf, data_len) ;\n\n        rbt_add_data(data, data_len, rbt_p) ;\n\n        memset(read_buf, 0x00, sizeof(read_buf) ) ;\n    }\n    fclose(fd) ;\n    return 0 ;\n}\n\n\/\/ \u6d4b\u8bd5 \u67e5\u8be2 \u529f\u80fd\nint rbt_search_data( char * data, size_t data_size, rbt_t * rbt_p ) {\n    int ret = 0 ;\n    uint64 key = CityHash64(data, data_size);\n    char * value = NULL;\n\n    ret = rbt_find(rbt_p, &amp;key, sizeof(uint64), (void**)&amp;value);\n    if( ret == 0 ) {\n        printf(\"%s:%s : key&#91;%lu] value&#91;%s]\\n\", __FILE__, __func__, key, value) ;\n        return 0 ;\n    } else {\n        fprintf(stderr, \"%s:%s : can not find key&#91;%lu] value&#91;%s]\\n\", __FILE__, __func__, key, value ) ;\n        return -1 ;\n    }\n}\n\nvoid my_free(void *v) {\n    printf(\"%s:%s : value = &#91;%s] delete\\n\", __FILE__, __func__, (char *) v) ;\n    free(v) ;\n}\n\nrbt_walk_return_code_t walk_cb(rbt_t *rbt, void *key, size_t klen, void *value, void *priv) {\n\n    static int i = 0 ;\n    char * prestr = (char *)priv ;\n\n    ++i ;\n    printf(\"%s:%s %s: i&#91;%d]  walk key&#91;%lu] value&#91;%s]\\n\", __FILE__, __func__, prestr, i, *(uint64 *)key, (char *) value ) ;\n\n    return RBT_WALK_CONTINUE  ;\n}\n\nint main(int argc, char * argv&#91;]) {\n\n    rbt_t * rbt_p = NULL ; \n\n    \/\/ \u6d4b\u8bd5\u521b\u5efa\n    rbt_p = rbt_create( libhl_cmp_keys_int64, my_free);\n\n    \/\/ \u6d4b\u8bd5\u6dfb\u52a0\u6570\u636e\n    printf(\"\\n\\n===================\u6d4b\u8bd5\u6dfb\u52a0\u6570\u636e=====================\\n\" ) ;\n    file_to_rbt(filepath, rbt_p ) ;\n\n    \/\/ \u6d4b\u8bd5\u67e5\u8be2\n    printf(\"\\n\\n===================\u6d4b\u8bd5\u67e5\u8be2=====================\\n\" ) ;\n    char * test1 = \"ID_LIKE=debian\" ;  \/\/ \u4ece filepath \u6587\u4ef6\u4e2d\u968f\u4fbf\u627e\u4e86\u4e00\u884c\u4f5c\u4e3a\u6d4b\u8bd5\u9879\n    rbt_search_data( test1, strlen(test1)+1, rbt_p ) ;\n\n    \/\/ \u6d4b\u8bd5\u5220\u9664\u6570\u636e\n    printf(\"\\n\\n===================\u6d4b\u8bd5\u5220\u9664\u6570\u636e=====================\\n\" ) ;\n    rbt_del_data( test1, strlen(test1)+1, rbt_p ) ;\n    \n    \/\/ \u6d4b\u8bd5\u67e5\u8be2\u4e00\u4e2a\u5df2\u7ecf\u5220\u9664\u7684\u6570\u636e\n    printf(\"\\n\\n===================\u6d4b\u8bd5\u67e5\u8be2\u5df2\u5220\u9664\u7684\u6570\u636e=====================\\n\" ) ;\n    rbt_search_data( test1, strlen(test1)+1, rbt_p ) ;\n\n    \/\/ \u904d\u5386\u6574\u4e2arbt\n    printf(\"\\n\\n===================\u904d\u5386\u6570\u636e=====================\\n\" ) ;\n    char * pre = \"this line is \" ;\n    rbt_walk(rbt_p , walk_cb, pre) ;\n\n    \/\/ \u9500\u6bc1 , \u4f1a\u81ea\u52a8\u8c03\u7528 my_free \n    printf(\"\\n\\n===================\u9500\u6bc1rbt=====================\\n\" ) ;\n    rbt_destroy(rbt_p);\n    return 0 ;\n}<\/code><\/pre>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>\u7f16\u8bd1\u6d4b\u8bd5<\/strong><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\u7f16\u8bd1\u6307\u4ee4\uff1a<code>gcc -Wall -o rbttst rbttst.c -lhl -lcityhash<\/code><\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>1\u3001\u5728\u521b\u5efa\u6570\u636e\u65f6\uff0c\u76f8\u540c\u54c8\u5e0c\u7684\u6570\u636e\uff0c\u4f1a\u7528\u65b0\u6570\u636e\u628a\u65e7\u6570\u636e\u66f4\u65b0\uff0c\u540c\u65f6\u9500\u6bc1\u65e7\u6570\u636e\uff1b<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>2\u3001\u6dfb\u52a0\u6570\u636e\u3001\u67e5\u8be2\u6570\u636e\u3001\u5220\u9664\u6570\u636e\uff0c\u8fd9\u4e09\u4e2a\u64cd\u4f5c\u4e2d\uff0c\u54c8\u5e0c\u7684\u8ba1\u7b97\u65b9\u6cd5\u548c\u63d0\u4f9b\u7684\u6570\u636e\u8981\u5b8c\u5168\u4e00\u81f4\u3002\u5982\u679c\u63d0\u4f9b\u7684\u6570\u636e\u7ed3\u6784\u4e2d\u5305\u542b\u6307\u9488\uff0c\u786e\u4fdd\u6307\u9488\u503c\u4e00\u81f4\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>3\u3001\u81ea\u6d4b\u7ea2\u9ed1\u6811\u904d\u5386\u5b58\u5728BUG\uff0c\u904d\u5386\u7684\u56de\u8c03\u51fd\u6570\u8fd4\u56de RBT_WALK_CONTINUE \u65f6\u597d\u4f7f\uff0c\u5176\u4ed6\u8fd4\u56de\u503c\u4e0d\u597d\u4f7f\u3002\u8fd9\u662f\u56e0\u4e3a\u7ea2\u9ed1\u6811\u8c03\u6574\u4ee5\u53ca\u6570\u636e\u9012\u5f52\u904d\u5386\u5bfc\u81f4\u7684\uff0c\u8fd8\u9700\u8981\u4fee\u6539libhl\u7684\u5f00\u6e90\u7684\u4ee3\u7801\u624d\u53ef\u4ee5\uff0c\u4ee5\u540e\u7528\u7a7a\u4e86\u8c03\u8bd5\u8c03\u8bd5\u518d\u66f4\u65b0\u3002<\/p>\n\n\n\n<div style=\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--10);height:0px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"705\" height=\"1024\" src=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-7-705x1024.png\" alt=\"\" class=\"wp-image-1508\" srcset=\"https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-7-705x1024.png 705w, https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-7-206x300.png 206w, https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-7-768x1116.png 768w, https:\/\/www.madbull.site\/wp-content\/uploads\/2024\/10\/\u56fe\u7247-7.png 869w\" sizes=\"auto, (max-width: 705px) 100vw, 705px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u6b21\u793a\u4f8b\u662f\u7ea2\u9ed1\u6811\u4f7f\u7528\u6d4b\u8bd5\u3002<br \/>\n\u6ce8\u610f\uff1a\u6b64\u7ea2\u9ed1\u6811 \u4e0d\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\u3002<br \/>\n\u6240\u4ee5\u5728\u591a\u7ebf\u7a0b\u4f7f\u7528\u65f6\uff0c\u5982\u679c\u540c\u65f6\u6d89\u53ca\u8bfb\u5199\uff0c\u5219\u9700\u8981\u4e0a\u9501\u6216\u8005\u901a\u8fc7\u65e0\u9501\u7f16\u7a0b\u5b9e\u73b0\u4e92\u65a5\u8bbf\u95ee\uff1b<br \/>\n\u5982\u679c\u628a\u6570\u636e\u4e00\u6b21\u6027\u4e14\u662f\u5355\u7ebf\u7a0b\u52a0\u8f7d\u5230\u7ea2\u9ed1\u6811\u4e2d\uff0c\u7136\u540e\u4e0d\u518d\u4fee\u6539\uff0c\u6b64\u540e\u53ea\u8bfb\u53d6\u6570\u636e\uff0c\u5219\u4e0d\u7528\u8003\u8651\u4e92\u65a5\u7684\u95ee\u9898\u3002<\/p>\n<p>\u6d4b\u8bd5\u4ee3\u7801<\/p>\n<p>\u793a\u4f8b\u628a \/etc\/os-release \u6587\u4ef6\u6bcf\u4e00\u884c\u53bb\u6389\u6362\u884c\u7b26 \\n \u540e\uff0c\u8ba1\u7b97\u54c8\u5e0c\u503c\uff0c\u6bcf\u4e00\u884c\u6570\u636e\u5199\u5165\u5230\u7ea2\u9ed1\u6811\u4e2d\uff0c\u6d89\u53ca\u5230 \u7ea2\u9ed1\u6811\u521b\u5efa\u3001\u6570\u636e\u589e\u52a0\u3001\u6570\u636e\u67e5\u8be2\u3001\u6570\u636e\u5220\u9664\u3001\u7ea2\u9ed1\u6811\u904d\u5386\u548c\u7ea2\u9ed1\u6811\u9500\u6bc1\u64cd\u4f5c\u3002<\/p>\n<p>\u672c\u6587\u5bf9\u6570\u636e\u505a\u54c8\u5e0c\u7b97\u6cd5\u4f7f\u7528\u7684 cityhash\uff0c\u5177\u4f53\u7528\u6cd5\u53c2\u770b\u5f80\u671f\u6587\u7ae0\uff1ahttps:\/\/www.madbull.site\/?p=1322 cityhash\u2013\u5bf9\u5b57\u7b26\u4e32\u7684\u54c8\u5e0c\u7b97\u6cd5<br \/>\n\u521b\u5efa.c\u6587\u4ef6 rbttst.c\uff0c\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n","protected":false},"author":1,"featured_media":559,"comment_status":"open","ping_status":"open","sticky":false,"template":"single-with-sidebar","format":"standard","meta":{"footnotes":""},"categories":[156,154],"tags":[472,461,495,498,97,364,464],"class_list":["post-1506","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-c","category-154","tag-cityhash","tag-libhl","tag-rbt","tag-498","tag-97","tag-364","tag-464"],"_links":{"self":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts\/1506","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1506"}],"version-history":[{"count":6,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts\/1506\/revisions"}],"predecessor-version":[{"id":1520,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/posts\/1506\/revisions\/1520"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=\/wp\/v2\/media\/559"}],"wp:attachment":[{"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1506"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1506"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.madbull.site\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1506"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}