/* * Copyright (C) 2012, 2016 higherfrequencytrading.com * Copyright (C) 2016 Roman Leventov * * This program 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. * * This program 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 <http://www.gnu.org/licenses/>. */ package net.openhft.chronicle.hash.impl.stage.iter; import net.openhft.chronicle.algo.hashing.LongHashFunction; import net.openhft.chronicle.core.OS; import net.openhft.chronicle.hash.impl.VanillaChronicleHashHolder; import net.openhft.chronicle.hash.impl.stage.entry.HashEntryStages; import net.openhft.chronicle.hash.impl.stage.entry.KeyHashCode; import net.openhft.chronicle.hash.impl.stage.entry.SegmentStages; import net.openhft.chronicle.hash.serialization.impl.IntegerDataAccess; import net.openhft.chronicle.hash.serialization.impl.WrongXxHash; import net.openhft.sg.StageRef; import net.openhft.sg.Staged; @Staged public class IterationKeyHashCode implements KeyHashCode { @StageRef VanillaChronicleHashHolder<?> hh; @StageRef SegmentStages s; @StageRef HashEntryStages<?> e; long keyHash = 0; void initKeyHash() { long addr = s.tierBaseAddr + e.keyOffset; long len = e.keySize; if (len == 4 && hh.h().keyDataAccess instanceof IntegerDataAccess) { keyHash = WrongXxHash.hashInt(OS.memory().readInt(addr)); } else { keyHash = LongHashFunction.xx_r39().hashMemory(addr, len); } } @Override public long keyHashCode() { return keyHash; } }