/* Copyright (C) 2014 Stony Brook University This file is part of Graphene Library OS. Graphene Library OS is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Graphene Library OS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ /* * This file contains functions to generate hash values for FS paths. */ #include static HASHTYPE __hash(const char* p, size_t len) { HASHTYPE hash = 0; for (; len >= sizeof(hash); p += sizeof(hash), len -= sizeof(hash)) { hash += *((HASHTYPE*)p); hash *= 9; } if (len) { HASHTYPE rest = 0; for (; len > 0; p++, len--) { rest <<= 8; rest += (HASHTYPE)*p; } hash += rest; hash *= 9; } return hash; } HASHTYPE hash_path(const char* path, size_t size) { HASHTYPE digest = 0; const char* elem_start = path; const char* c = path; for (; c < path + size && *c; c++) { if (*c == '/') { digest ^= __hash(elem_start, c - elem_start); elem_start = c + 1; } } digest ^= __hash(elem_start, c - elem_start); return digest; } HASHTYPE rehash_name(HASHTYPE parent_hbuf, const char* name, size_t size) { return parent_hbuf ^ __hash(name, size); } HASHTYPE rehash_path(HASHTYPE ancestor_hbuf, const char* path, size_t size) { return ancestor_hbuf ^ hash_path(path, size); }