store_key_md5.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:5k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: store_key_md5.c,v 1.20 1999/01/19 02:24:33 wessels Exp $
  3.  *
  4.  * DEBUG: section 20    Storage Manager MD5 Cache Keys
  5.  * AUTHOR: Duane Wessels
  6.  *
  7.  * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/
  8.  * ----------------------------------------------------------
  9.  *
  10.  *  Squid is the result of efforts by numerous individuals from the
  11.  *  Internet community.  Development is led by Duane Wessels of the
  12.  *  National Laboratory for Applied Network Research and funded by the
  13.  *  National Science Foundation.  Squid is Copyrighted (C) 1998 by
  14.  *  Duane Wessels and the University of California San Diego.  Please
  15.  *  see the COPYRIGHT file for full details.  Squid incorporates
  16.  *  software developed and/or copyrighted by other sources.  Please see
  17.  *  the CREDITS file for full details.
  18.  *
  19.  *  This program is free software; you can redistribute it and/or modify
  20.  *  it under the terms of the GNU General Public License as published by
  21.  *  the Free Software Foundation; either version 2 of the License, or
  22.  *  (at your option) any later version.
  23.  *  
  24.  *  This program is distributed in the hope that it will be useful,
  25.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.  *  GNU General Public License for more details.
  28.  *  
  29.  *  You should have received a copy of the GNU General Public License
  30.  *  along with this program; if not, write to the Free Software
  31.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  32.  *
  33.  */
  34. #include "squid.h"
  35. static cache_key null_key[MD5_DIGEST_CHARS];
  36. const char *
  37. storeKeyText(const unsigned char *key)
  38. {
  39.     static MemBuf mb = MemBufNULL;
  40.     int i;
  41.     memBufReset(&mb);
  42.     for (i = 0; i < MD5_DIGEST_CHARS; i++)
  43. memBufPrintf(&mb, "%02X", *(key + i));
  44.     return mb.buf;
  45. }
  46. const cache_key *
  47. storeKeyScan(const char *buf)
  48. {
  49.     static unsigned char digest[MD5_DIGEST_CHARS];
  50.     int i;
  51.     int j = 0;
  52.     char t[3];
  53.     for (i = 0; i < MD5_DIGEST_CHARS; i++) {
  54. t[0] = *(buf + (j++));
  55. t[1] = *(buf + (j++));
  56. t[2] = '';
  57. *(digest + i) = (unsigned char) strtol(t, NULL, 16);
  58.     }
  59.     return digest;
  60. }
  61. int
  62. storeKeyHashCmp(const void *a, const void *b)
  63. {
  64.     const unsigned char *A = a;
  65.     const unsigned char *B = b;
  66.     int i;
  67.     for (i = 0; i < MD5_DIGEST_CHARS; i++) {
  68. if (A[i] < B[i])
  69.     return -1;
  70. if (A[i] > B[i])
  71.     return 1;
  72.     }
  73.     return 0;
  74. }
  75. unsigned int
  76. storeKeyHashHash(const void *key, unsigned int n)
  77. {
  78.     /* note, n must be a power of 2! */
  79.     const unsigned char *digest = key;
  80.     unsigned int i = digest[0]
  81.     | digest[1] << 8
  82.     | digest[2] << 16
  83.     | digest[3] << 24;
  84.     return (i & (--n));
  85. }
  86. const cache_key *
  87. storeKeyPrivate(const char *url, method_t method, int id)
  88. {
  89.     static cache_key digest[MD5_DIGEST_CHARS];
  90.     MD5_CTX M;
  91.     assert(id > 0);
  92.     debug(20, 3) ("storeKeyPrivate: %s %sn",
  93. RequestMethodStr[method], url);
  94.     MD5Init(&M);
  95.     MD5Update(&M, (unsigned char *) &id, sizeof(id));
  96.     MD5Update(&M, (unsigned char *) &method, sizeof(method));
  97.     MD5Update(&M, (unsigned char *) url, strlen(url));
  98.     MD5Final(digest, &M);
  99.     return digest;
  100. }
  101. /*
  102.  * Compatibility transition period.  Remove this after Mar 26, 1998
  103.  */
  104. const cache_key *
  105. storeKeyPublicOld(const char *url, const method_t method)
  106. {
  107.     static cache_key digest[MD5_DIGEST_CHARS];
  108.     MD5_CTX M;
  109.     MD5Init(&M);
  110.     MD5Update(&M, (unsigned char *) &method, sizeof(method));
  111.     MD5Update(&M, (unsigned char *) url, strlen(url));
  112.     MD5Final(digest, &M);
  113.     return digest;
  114. }
  115. const cache_key *
  116. storeKeyPublic(const char *url, const method_t method)
  117. {
  118.     static cache_key digest[MD5_DIGEST_CHARS];
  119.     unsigned char m = (unsigned char) method;
  120.     MD5_CTX M;
  121.     MD5Init(&M);
  122.     MD5Update(&M, &m, sizeof(m));
  123.     MD5Update(&M, (unsigned char *) url, strlen(url));
  124.     MD5Final(digest, &M);
  125.     return digest;
  126. }
  127. const cache_key *
  128. storeKeyDup(const cache_key * key)
  129. {
  130.     cache_key *dup = memAllocate(MEM_MD5_DIGEST);
  131.     xmemcpy(dup, key, MD5_DIGEST_CHARS);
  132.     return dup;
  133. }
  134. cache_key *
  135. storeKeyCopy(cache_key * dst, const cache_key * src)
  136. {
  137.     xmemcpy(dst, src, MD5_DIGEST_CHARS);
  138.     return dst;
  139. }
  140. void
  141. storeKeyFree(const cache_key * key)
  142. {
  143.     memFree((void *) key, MEM_MD5_DIGEST);
  144. }
  145. int
  146. storeKeyHashBuckets(int nobj)
  147. {
  148.     if (nobj < 0x2000)
  149. return 0x2000;
  150.     if (nobj < 0x4000)
  151. return 0x4000;
  152.     if (nobj < 0x8000)
  153. return 0x8000;
  154.     return 0x10000;
  155. }
  156. int
  157. storeKeyNull(const cache_key * key)
  158. {
  159.     if (memcmp(key, null_key, MD5_DIGEST_CHARS) == 0)
  160. return 1;
  161.     else
  162. return 0;
  163. }
  164. void
  165. storeKeyInit(void)
  166. {
  167.     memset(null_key, '', MD5_DIGEST_CHARS);
  168. }