char *APCFileStorage::put(const char *data, int32_t len) { Lock lock(m_lock); if (m_state != StorageState::Open || len + PaddingSize > m_chunkSize - PaddingSize) { return nullptr; } if (len + PaddingSize > m_chunkRemain && !addFile()) { m_state = StorageState::Full; return nullptr; } assert(m_current); assert(len + PaddingSize <= m_chunkRemain); strhash_t h = hash_string_unsafe(data, len); *(strhash_t*)m_current = h; m_current += sizeof(h); *(int32_t*)m_current = len; m_current += sizeof(len); // should be no overlap memcpy(m_current, data, len); char *addr = m_current; addr[len] = '\0'; m_current += len + sizeof(char); *(strhash_t*)m_current = TombHash; m_chunkRemain -= len + PaddingSize; return addr; }
void StringData::preCompute() { StringSlice s = slice(); m_hash = hash_string_unsafe(s.ptr, s.len); assert(m_hash >= 0); if (s.len > 0 && (is_numeric_string(s.ptr, s.len, nullptr, nullptr, 1, nullptr) == KindOfNull)) { m_hash |= STRHASH_MSB; } }
void StringData::preCompute() { auto s = slice(); m_hash = hash_string_unsafe(s.data(), s.size()); assert(m_hash >= 0); if (s.size() > 0 && (is_numeric_string(s.data(), s.size(), nullptr, nullptr, 1, nullptr) == KindOfNull)) { m_hash |= STRHASH_MSB; } }
size_t operator()(const String& s) const { return hash_string_unsafe(s.data(), s.size()); }