mdfingerprint.java

来自「dump3 morpheus 0.2.9 src」· Java 代码 · 共 138 行

JAVA
138
字号
/**
 * DuMP3 version morpheus_0.2.9 - a duplicate/similar file finder in Java<BR>
 * Copyright 2005 Alexander Gr&auml;sser<BR>
 * All Rights Reserved, http://dump3.sourceforge.net/<BR>
 * <BR>
 * This file is part of DuMP3.<BR>
 * <BR>
 * DuMP3 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option) any later version.<BR>
 * <BR>
 * DuMP3 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 General Public License for more details.<BR>
 * <BR>
 * You should have received a copy of the GNU General Public License along with DuMP3; if not, write to the Free Software Foundation, Inc., 51 Franklin St,
 * Fifth Floor, Boston, MA 02110-1301 USA
 */
package net.za.grasser.duplicate.fingerprint;

import java.security.NoSuchAlgorithmException;
import jonelo.jacksum.JacksumAPI;
import jonelo.jacksum.algorithm.AbstractChecksum;
import net.za.grasser.duplicate.file.FingerprintFile;
import net.za.grasser.duplicate.file.Status;
import net.za.grasser.duplicate.fingerprint.configure.ConfigFactory;
import net.za.grasser.duplicate.fingerprint.configure.MDFingerprintConfig;
import net.za.grasser.duplicate.util.HexArray;
import org.apache.log4j.Logger;

/**
 * @author <a href="http://sourceforge.net/sendmessage.php?touser=733840">pyropunk at sourceforge dot net</a>
 * @version $Revision: 1.10 $
 * @modelguid {57599672-FC9B-486D-A969-9A645E7DEFB7}
 */
public class MDFingerprint extends AbstractFingerprint {
  /** @modelguid {55FFD1FB-DF09-4575-A86F-A2B682A46924} */
  private static final Logger log = Logger.getLogger(MDFingerprint.class);
  /**
   * <code>config</code> MDFingerprint -
   */
  protected static final MDFingerprintConfig config = (MDFingerprintConfig)ConfigFactory.getConfig(MDFingerprint.class);
  /**
   * <code>checksum</code> MDFingerprint -
   */
  protected AbstractChecksum checksum = null;

  /**
   * @param fi FingerprintFile
   * @modelguid {53F63DBA-703A-4B81-882B-F1B4318D5CC9}
   */
  public MDFingerprint(final FingerprintFile fi) {
    super(fi);
  }

  /**
   * setup phase before reading the file
   */
  @Override
  protected void preRead() {
    try {
      checksum = JacksumAPI.getChecksumInstance(config.getMessageDigest());
    } catch (final NoSuchAlgorithmException nsae) {
      throw new RuntimeException("Checksum Config error!");
    }
    checksum.setEncoding(AbstractChecksum.HEX);
    // checksum.setHex(true);
    // checksum.setUpperCase(false);
    checksum.reset();
  }

  /**
   * teardown phase after reading the file<BR>
   * fingerprint must be computed here
   */
  @Override
  protected void postRead() {
    final String fp = checksum.format("#CHECKSUM");
    checksum = null;
    log.debug(getFile().getPath() + " fingerprint:" + fp);
    fingerprint = HexArray.makeBytes(fp);
  }

  /**
   * update the checksum with a byte array.
   * 
   * @param pBuffer
   * @param pLength
   */
  @Override
  protected void update(final byte[] pBuffer, final int pLength) {
    checksum.update(pBuffer, 0, pLength);
  }

  /**
   * @param fi AbstractFingerprint
   * @return boolean
   * @modelguid {B275D8C6-611D-424F-B031-DB737C07FD11}
   */
  @Override
  public float matches(final AbstractFingerprint fi) {
    final FingerprintFile ff1 = getFile();
    final FingerprintFile ff2 = fi.getFile();
    if (ff1.getStatus() != Status.FILE_OK && ff1.getStatus() != Status.FILE_SIGNATURE_MISMATCH || ff2.getStatus() != Status.FILE_OK
        && ff2.getStatus() != Status.FILE_SIGNATURE_MISMATCH) {
      return 0.0f;
    }
    if (ff1.getLength() != ff2.getLength()) {
      log.debug("" + ff1.getLength() + "!=" + ff2.getLength());
      return 0.0f;
    }
    // try to read the files
    getFingerprint();
    fi.getFingerprint();
    // check status
    if ((ff1.getStatus() == Status.FILE_OK || ff1.getStatus() == Status.FILE_SIGNATURE_MISMATCH)
        && (ff2.getStatus() == Status.FILE_OK || ff2.getStatus() == Status.FILE_SIGNATURE_MISMATCH)) {
      return equals(getFingerprint(), fi.getFingerprint()) ? 100.0f : 0.0f;
    }
    return 0.0f;
  }

  /**
   * @return String
   * @modelguid {E440866E-6C37-49CC-8B8A-E6645E19C3B1}
   */
  @Override
  public String getClassName() {
    return super.getClassName() + '-' + config.getMessageDigest();
  }

  /**
   * @see net.za.grasser.duplicate.fingerprint.AbstractFingerprint#getSimilarityThreshhold()
   */
  @Override
  public float getSimilarityThreshhold() {
    return config.getSimilarityThreshhold();
  }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?