/* * Copyright (c) 2008-2010 by Christian Lorenz, * Zuse Institute Berlin * * Licensed under the BSD License, see LICENSE file for details. * */ package de.mxro.thrd.xstreemfs.foundation.checksums.algorithms; import java.nio.ByteBuffer; import de.mxro.thrd.xstreemfs.foundation.checksums.StringChecksumAlgorithm; /** * The SDBM algorithm. * * 02.09.2008 * * @author clorenz */ public class SDBM implements StringChecksumAlgorithm { private Long hash = null; private String name = "SDBM"; /** * Updates checksum with specified data. * * @param data */ public void digest(String data) { this.hash = sdbmHash(data); } /* * (non-Javadoc) * * @see org.xtreemfs.foundation.checksums.ChecksumAlgorithm#digest(java.nio.ByteBuffer) */ @Override public void update(ByteBuffer data) { byte[] array; if (data.hasArray()) { array = data.array(); } else { array = new byte[data.capacity()]; final int oldPos = data.position(); data.position(0); data.get(array); data.position(oldPos); } this.hash = sdbmHash(new String(array)); } /* * (non-Javadoc) * * @see org.xtreemfs.foundation.checksums.ChecksumAlgorithm#getName() */ @Override public String getName() { return this.name; } /* * (non-Javadoc) * * @see org.xtreemfs.foundation.checksums.ChecksumAlgorithm#getValue() */ @Override public long getValue() { long value; if (this.hash != null) value = this.hash; else value = 0; reset(); return value; } /* * (non-Javadoc) * * @see org.xtreemfs.foundation.checksums.ChecksumAlgorithm#reset() */ @Override public void reset() { hash = null; } /* * (non-Javadoc) * * @see org.xtreemfs.common.checksum.ChecksumAlgorithm#clone() */ @Override public SDBM clone() { return new SDBM(); } /** * SDBM algorithm * * @param str * @return */ protected static long sdbmHash(String str) { long hash = 0; for (int c : str.toCharArray()) { hash = c + (hash << 6) + (hash << 16) - hash; } return hash; } }