{"id":935,"date":"2007-06-08T00:01:45","date_gmt":"2007-06-07T23:01:45","guid":{"rendered":"http:\/\/www.lubica.net\/bigwhale\/blog\/?p=935"},"modified":"2007-06-08T05:27:49","modified_gmt":"2007-06-08T04:27:49","slug":"tole-sem-zgruntal","status":"publish","type":"post","link":"https:\/\/lubica.net\/bigwhale\/blog\/tole-sem-zgruntal\/","title":{"rendered":"Tole sem zgruntal"},"content":{"rendered":"<p>[c]<br \/>\nunsigned long Hash(void *buf, size_t length, unsigned long hashValue)<br \/>\n{<br \/>\n  unsigned char *bStart = (unsigned char *)buf;<br \/>\n  unsigned char *bEnd = bStart + length;\t\t<\/p>\n<p>  while (bStart < bEnd)\n  {\n    hashValue ^= (long)*bStart++;\n    hashValue += hashValue << 13;\n    hashValue ^= hashValue << 3;\n    hashValue += hashValue >> 5;<br \/>\n    hashValue ^= hashValue < < 11;\n    hashValue += hashValue >> 17;<br \/>\n    hashValue ^= hashValue << 17;\n  }\n\n  return hashValue;\n}\n[\/c]\n\nLahko kdo pohitri tole? Trenutne lastnosti, za vsak spremenjeni bit v podanem nizu se spremenijo vsi biti hasha. Precej dobra razporeditev hashev po celotnem hash prostoru. Torej, niz 000001, ne bo samo za eno vrednost oddaljen od niza 000002. Hash je inkrementalen (aditiven?) in mu lahko podamo za\u010detno vrednost. Se pravi, hash za \"SlovenskiPionir\" je isti, kot hash za \"Pionir\", \u010de mu kot za\u010detno vrednost podamo hash za \"Slovenski\".\n\nVse kar rabim je hitrost. Ukvarjal sem se z idejo, da bi za prve znake lahko kar vnaprej zra\u010dunal hash vrednosti in jih spravil v neko tabelo, potem bi vse skupaj uporabil nekako takole:\n\n[c]\nunsigned long hashes[255] = {hash1, hash2, hash3, hash4 .... hash255};\n\n  unsigned char *bStart = (unsigned char *)buf;\n  unsigned char *bEnd = bStart + length;\t\t\n\n  if (hashValue == 0)\n  {\n    hashValue = hashes[(unsigned char)buf[0]];\n    *bStart++;\n  }\n\n  while (bStart < bEnd)\n  {\n    hashValue ^= (long)*bStart++;\n\n...\n[\/c]\n\nAmpak pri stringu dolgem 50 znakov na primer, bi bila pohitritev minimalna. \u010ce bi vse skupaj sploh bilo kaj hitreje.\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[c] unsigned long Hash(void *buf, size_t length, unsigned long hashValue) { unsigned char *bStart = (unsigned char *)buf; unsigned char *bEnd = bStart + length; while (bStart < bEnd) { hashValue ^= (long)*bStart++; hashValue += hashValue 5; hashValue ^= hashValue < < 11; hashValue += hashValue >> 17; hashValue ^= hashValue<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-935","post","type-post","status-publish","format-standard","hentry","category-tech-stuff"],"_links":{"self":[{"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/posts\/935","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/comments?post=935"}],"version-history":[{"count":0,"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/posts\/935\/revisions"}],"wp:attachment":[{"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/media?parent=935"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/categories?post=935"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lubica.net\/bigwhale\/blog\/wp-json\/wp\/v2\/tags?post=935"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}