1e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/******************************************************************************* 2398ee59bebad6835dab57b60157eff16d511709eMarc R. Hoffmann * Copyright (c) 2009, 2015 Mountainminds GmbH & Co. KG and Contributors 3e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * All rights reserved. This program and the accompanying materials 4e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * are made available under the terms of the Eclipse Public License v1.0 5e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * which accompanies this distribution, and is available at 6e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * http://www.eclipse.org/legal/epl-v10.html 7e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 8e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Contributors: 9e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Marc R. Hoffmann - initial API and implementation 10e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 11e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *******************************************************************************/ 12e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpackage org.jacoco.core.internal.data; 13e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 14e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/** 15e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * CRC64 checksum calculator based on the polynom specified in ISO 3309. The 16e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * implementation is based on the following publications: 17e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 18e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * <ul> 19e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * <li>http://en.wikipedia.org/wiki/Cyclic_redundancy_check</li> 20e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * <li>http://www.geocities.com/SiliconValley/Pines/8659/crc.htm</li> 21e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * </ul> 22e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 23e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpublic final class CRC64 { 24e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 25e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov private static final long POLY64REV = 0xd800000000000000L; 26e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 27e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov private static final long[] LOOKUPTABLE; 28e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 29e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov static { 30e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov LOOKUPTABLE = new long[0x100]; 31e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov for (int i = 0; i < 0x100; i++) { 32e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov long v = i; 33e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov for (int j = 0; j < 8; j++) { 34e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov if ((v & 1) == 1) { 35e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov v = (v >>> 1) ^ POLY64REV; 36e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } else { 37e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov v = (v >>> 1); 38e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 39e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 40e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov LOOKUPTABLE[i] = v; 41e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 42e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 43e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 44e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov /** 45e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Calculates the CRC64 checksum for the given data array. 46e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * 47e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @param data 48e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * data to calculate checksum for 49e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * @return checksum value 50e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */ 51e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov public static long checksum(final byte[] data) { 52e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov long sum = 0; 536396bb4769d9c044d38cebb126a81fc6cded8e01Marc R. Hoffmann for (final byte b : data) { 546396bb4769d9c044d38cebb126a81fc6cded8e01Marc R. Hoffmann final int lookupidx = ((int) sum ^ b) & 0xff; 55e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov sum = (sum >>> 8) ^ LOOKUPTABLE[lookupidx]; 56e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 57e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov return sum; 58e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 59e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 60e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov private CRC64() { 61e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov } 62e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov 63e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov} 64