1b901e1f212c11afda05f2628a522d86802f87c52José Fonseca/**************************************************************************
2b901e1f212c11afda05f2628a522d86802f87c52José Fonseca *
3b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * Copyright 2008 VMware, Inc.
4b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * All Rights Reserved.
5b901e1f212c11afda05f2628a522d86802f87c52José Fonseca *
6b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * copy of this software and associated documentation files (the
8b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * "Software"), to deal in the Software without restriction, including
9b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * permit persons to whom the Software is furnished to do so, subject to
12b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * the following conditions:
13b901e1f212c11afda05f2628a522d86802f87c52José Fonseca *
14b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * The above copyright notice and this permission notice (including the
15b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * next paragraph) shall be included in all copies or substantial portions
16b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * of the Software.
17b901e1f212c11afda05f2628a522d86802f87c52José Fonseca *
18b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25b901e1f212c11afda05f2628a522d86802f87c52José Fonseca *
26b901e1f212c11afda05f2628a522d86802f87c52José Fonseca **************************************************************************/
27b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
28b901e1f212c11afda05f2628a522d86802f87c52José Fonseca/**
29b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * @file
30b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * Hash functions implementation.
31b901e1f212c11afda05f2628a522d86802f87c52José Fonseca *
32b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * @author Jose Fonseca
33b901e1f212c11afda05f2628a522d86802f87c52José Fonseca */
34b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
35b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
36b901e1f212c11afda05f2628a522d86802f87c52José Fonseca#include "u_hash.h"
37b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
38b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
39ae7e75d6108e8621878083b35a13edc1aca893dfJosé Fonsecastatic const uint32_t
40b901e1f212c11afda05f2628a522d86802f87c52José Fonsecautil_crc32_table[256] = {
41b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
42b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
43b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
44b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
45b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
46b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
47b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
48b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
49b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
50b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
51b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
52b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
53b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
54b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
55b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
56b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
57b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
58b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
59b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
60b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
61b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
62b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
63b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
64b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
65b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
66b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
67b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
68b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
69b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
70b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
71b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
72b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
73b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
74b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
75b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
76b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
77b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
78b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
79b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
80b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
81b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
82b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
83b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
84b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
85b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
86b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
87b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
88b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
89b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
90b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
91b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
92b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
93b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
94b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
95b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
96b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
97b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
98b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
99b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
100b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
101b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
102b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
103b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
104b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
105b901e1f212c11afda05f2628a522d86802f87c52José Fonseca};
106b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
107b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
108b901e1f212c11afda05f2628a522d86802f87c52José Fonseca/**
109b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * @sa http://www.w3.org/TR/PNG/#D-CRCAppendix
110b901e1f212c11afda05f2628a522d86802f87c52José Fonseca */
111b901e1f212c11afda05f2628a522d86802f87c52José Fonsecauint32_t
112ae7e75d6108e8621878083b35a13edc1aca893dfJosé Fonsecautil_hash_crc32(const void *data, size_t size)
113b901e1f212c11afda05f2628a522d86802f87c52José Fonseca{
114b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   uint8_t *p = (uint8_t *)data;
115b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   uint32_t crc = 0xffffffff;
116b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
117b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   while (size--)
118b901e1f212c11afda05f2628a522d86802f87c52José Fonseca      crc = util_crc32_table[(crc ^ *p++) & 0xff] ^ (crc >> 8);
119b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
120b901e1f212c11afda05f2628a522d86802f87c52José Fonseca   return crc;
121b901e1f212c11afda05f2628a522d86802f87c52José Fonseca}
122