TS-2964: Make URL hash run time selectable.

Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/2ac12c4a
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/2ac12c4a
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/2ac12c4a

Branch: refs/heads/master
Commit: 2ac12c4a2770600743d12964f4b998ba38b05116
Parents: 4268793
Author: Alan M. Carroll <[email protected]>
Authored: Mon Jul 28 10:39:21 2014 -0500
Committer: Alan M. Carroll <[email protected]>
Committed: Fri Aug 1 09:24:33 2014 -0500

----------------------------------------------------------------------
 iocore/cache/Cache.cc          |  72 ++---
 iocore/cache/CacheDir.cc       | 112 +++----
 iocore/cache/CacheHosting.cc   |   4 +-
 iocore/cache/CacheHttp.cc      |   2 +-
 iocore/cache/CachePages.cc     |   8 +-
 iocore/cache/CacheRead.cc      |  60 ++--
 iocore/cache/CacheTest.cc      |   4 +-
 iocore/cache/CacheVol.cc       |   2 +-
 iocore/cache/CacheWrite.cc     |  58 ++--
 iocore/cache/P_CacheDir.h      |   4 +-
 iocore/cache/P_CacheHosting.h  |   4 +-
 iocore/cache/P_CacheInternal.h |  12 +-
 iocore/cache/P_CacheVol.h      |  50 +--
 iocore/cache/RamCacheCLFUS.cc  |  46 +--
 iocore/cache/RamCacheLRU.cc    |  22 +-
 iocore/hostdb/HostDB.cc        |   3 +-
 lib/ts/CryptoHash.h            | 124 ++++++++
 lib/ts/INK_MD5.h               | 139 +--------
 lib/ts/MMH.cc                  | 588 ++++++++++++++++++++++++++++++++++++
 lib/ts/MMH.h                   | 119 ++++++++
 lib/ts/Makefile.am             |   3 +
 lib/ts/ink_code.cc             |  37 ++-
 lib/ts/ink_code.h              |   3 +-
 lib/ts/libts.h                 |   1 +
 proxy/InkAPI.cc                |  11 +-
 proxy/Prefetch.cc              |   8 +-
 proxy/Update.cc                |   3 +-
 proxy/hdrs/URL.cc              |  82 ++---
 proxy/hdrs/URL.h               |  41 ++-
 proxy/http/HttpServerSession.h |   2 +-
 proxy/logging/LogFormat.cc     |  12 +-
 proxy/logging/LogObject.cc     |   7 +-
 32 files changed, 1208 insertions(+), 435 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/Cache.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/Cache.cc b/iocore/cache/Cache.cc
index 03a3650..7d4a8f1 100644
--- a/iocore/cache/Cache.cc
+++ b/iocore/cache/Cache.cc
@@ -116,7 +116,7 @@ ClassAllocator<EvacuationBlock> 
evacuationBlockAllocator("evacuationBlock");
 ClassAllocator<CacheRemoveCont> cacheRemoveContAllocator("cacheRemoveCont");
 ClassAllocator<EvacuationKey> evacuationKeyAllocator("evacuationKey");
 int CacheVC::size_to_init = -1;
-CacheKey zero_key(0, 0);
+CacheKey zero_key;
 #if TS_USE_INTERIM_CACHE == 1
 ClassAllocator<MigrateToInterimCache> 
migrateToInterimCacheAllocator("migrateToInterimCache");
 #endif
@@ -1114,7 +1114,7 @@ int
 Vol::db_check(bool /* fix ATS_UNUSED */ )
 {
   char tt[256];
-  printf("    Data for [%s]\n", hash_id);
+  printf("    Data for [%s]\n", hash_text);
   printf("        Length:          %" PRIu64 "\n", (uint64_t)len);
   printf("        Write Position:  %" PRIu64 "\n", (uint64_t) 
(header->write_pos - skip));
   printf("        Phase:           %d\n", (int)!!header->phase);
@@ -1212,7 +1212,7 @@ vol_dir_clear(Vol *d)
   vol_clear_init(d);
 
   if (pwrite(d->fd, d->raw_dir, dir_len, d->skip) < 0) {
-    Warning("unable to clear cache directory '%s'", d->hash_id);
+    Warning("unable to clear cache directory '%s'", d->hash_text);
     return -1;
   }
   return 0;
@@ -1242,13 +1242,13 @@ Vol::init(char *s, off_t blocks, off_t dir_skip, bool 
clear)
 {
   dir_skip = ROUND_TO_STORE_BLOCK((dir_skip < START_POS ? START_POS : 
dir_skip));
   path = ats_strdup(s);
-  const size_t hash_id_size = strlen(s) + 32;
-  hash_id = (char *)ats_malloc(hash_id_size);
-  ink_strlcpy(hash_id, s, hash_id_size);
+  const size_t hash_text_size = strlen(s) + 32;
+  hash_text = (char *)ats_malloc(hash_text_size);
+  ink_strlcpy(hash_text, s, hash_text_size);
   const size_t s_size = strlen(s);
-  snprintf(hash_id + s_size, (hash_id_size - s_size), " %" PRIu64 ":%" PRIu64 
"",
+  snprintf(hash_text + s_size, (hash_text_size - s_size), " %" PRIu64 ":%" 
PRIu64 "",
            (uint64_t)dir_skip, (uint64_t)blocks);
-  hash_id_md5.encodeBuffer(hash_id, strlen(hash_id));
+  MD5Context().hash_immediate(hash_id, hash_text, strlen(hash_text));
   len = blocks * STORE_BLOCK_SIZE;
   ink_assert(len <= MAX_VOL_SIZE);
   skip = dir_skip;
@@ -1286,7 +1286,7 @@ Vol::init(char *s, off_t blocks, off_t dir_skip, bool 
clear)
 #endif
 
   if (clear) {
-    Note("clearing cache directory '%s'", hash_id);
+    Note("clearing cache directory '%s'", hash_text);
     return clear_dir();
   }
 
@@ -1296,7 +1296,7 @@ Vol::init(char *s, off_t blocks, off_t dir_skip, bool 
clear)
   // try A
   off_t as = skip;
   if (is_debug_tag_set("cache_init"))
-    Note("reading directory '%s'", hash_id);
+    Note("reading directory '%s'", hash_text);
   SET_HANDLER(&Vol::handle_header_read);
   init_info->vol_aio[0].aiocb.aio_offset = as;
   init_info->vol_aio[1].aiocb.aio_offset = as + footer_offset;
@@ -1330,7 +1330,7 @@ Vol::handle_dir_clear(int event, void *data)
   if (event == AIO_EVENT_DONE) {
     op = (AIOCallback *) data;
     if ((size_t) op->aio_result != (size_t) op->aiocb.aio_nbytes) {
-      Warning("unable to clear cache directory '%s'", hash_id);
+      Warning("unable to clear cache directory '%s'", hash_text);
       fd = -1;
     }
 
@@ -1364,8 +1364,8 @@ Vol::handle_dir_read(int event, void *data)
   }
 
   if (header->magic != VOL_MAGIC || header->version.ink_major != 
CACHE_DB_MAJOR_VERSION || footer->magic != VOL_MAGIC) {
-    Warning("bad footer in cache directory for '%s', clearing", hash_id);
-    Note("clearing cache directory '%s'", hash_id);
+    Warning("bad footer in cache directory for '%s', clearing", hash_text);
+    Note("clearing cache directory '%s'", hash_text);
     clear_dir();
     return EVENT_DONE;
   }
@@ -1461,7 +1461,7 @@ Vol::handle_recover_from_data(int event, void * /* data 
ATS_UNUSED */ )
       io.aiocb.aio_nbytes = (skip + len) - recover_pos;
   } else if (event == AIO_EVENT_DONE) {
     if ((size_t) io.aiocb.aio_nbytes != (size_t) io.aio_result) {
-      Warning("disk read error on recover '%s', clearing", hash_id);
+      Warning("disk read error on recover '%s', clearing", hash_text);
       goto Lclear;
     }
     if (io.aiocb.aio_offset == header->last_write_pos) {
@@ -1478,7 +1478,7 @@ Vol::handle_recover_from_data(int event, void * /* data 
ATS_UNUSED */ )
       while (done < to_check) {
         Doc *doc = (Doc *) (s + done);
         if (doc->magic != DOC_MAGIC || doc->write_serial > 
header->write_serial) {
-          Warning("no valid directory found while recovering '%s', clearing", 
hash_id);
+          Warning("no valid directory found while recovering '%s', clearing", 
hash_text);
           goto Lclear;
         }
         done += round_to_approx_size(doc->len);
@@ -1621,7 +1621,7 @@ Ldone:{
     recover_pos += EVACUATION_SIZE;   // safely cover the max write size
     if (recover_pos < header->write_pos && (recover_pos + EVACUATION_SIZE >= 
header->write_pos)) {
       Debug("cache_init", "Head Pos: %" PRIu64 ", Rec Pos: %" PRIu64 ", 
Wrapped:%d", header->write_pos, recover_pos, recover_wrapped);
-      Warning("no valid directory found while recovering '%s', clearing", 
hash_id);
+      Warning("no valid directory found while recovering '%s', clearing", 
hash_text);
       goto Lclear;
     }
 
@@ -1728,7 +1728,7 @@ Vol::handle_header_read(int event, void *data)
         (hf[0]->sync_serial >= hf[2]->sync_serial || hf[2]->sync_serial != 
hf[3]->sync_serial)) {
       SET_HANDLER(&Vol::handle_dir_read);
       if (is_debug_tag_set("cache_init"))
-        Note("using directory A for '%s'", hash_id);
+        Note("using directory A for '%s'", hash_text);
       io.aiocb.aio_offset = skip;
       ink_assert(ink_aio_read(&io));
     }
@@ -1737,11 +1737,11 @@ Vol::handle_header_read(int event, void *data)
 
       SET_HANDLER(&Vol::handle_dir_read);
       if (is_debug_tag_set("cache_init"))
-        Note("using directory B for '%s'", hash_id);
+        Note("using directory B for '%s'", hash_text);
       io.aiocb.aio_offset = skip + vol_dirlen(this);
       ink_assert(ink_aio_read(&io));
     } else {
-      Note("no good directory, clearing '%s'", hash_id);
+      Note("no good directory, clearing '%s'", hash_text);
       clear_dir();
       delete init_info;
       init_info = 0;
@@ -1796,7 +1796,7 @@ InterimCacheVol::handle_recover_from_data(int event, void 
*data)
 
   if (event == EVENT_IMMEDIATE) {
     if (header->magic != VOL_MAGIC || header->version.ink_major != 
CACHE_DB_MAJOR_VERSION) {
-      Warning("bad header in cache directory for '%s', clearing", hash_id);
+      Warning("bad header in cache directory for '%s', clearing", hash_text);
       goto Lclear;
     } else if (header->sync_serial == 0) {
       io.aiocb.aio_buf = NULL;
@@ -1820,7 +1820,7 @@ InterimCacheVol::handle_recover_from_data(int event, void 
*data)
 
   } else if (event == AIO_EVENT_DONE) {
     if ((size_t) io.aiocb.aio_nbytes != (size_t) io.aio_result) {
-      Warning("disk read error on recover '%s', clearing", hash_id);
+      Warning("disk read error on recover '%s', clearing", hash_text);
       goto Lclear;
     }
 
@@ -1832,7 +1832,7 @@ InterimCacheVol::handle_recover_from_data(int event, void 
*data)
       while (done < to_check) {
         Doc *doc = (Doc *) (s + done);
         if (doc->magic != DOC_MAGIC || doc->write_serial > 
header->write_serial) {
-          Warning("no valid directory found while recovering '%s', clearing", 
hash_id);
+          Warning("no valid directory found while recovering '%s', clearing", 
hash_text);
           goto Lclear;
         }
         done += round_to_approx_size(doc->len);
@@ -1939,7 +1939,7 @@ Ldone: {
     recover_pos += EVACUATION_SIZE;
     if (recover_pos < header->write_pos && (recover_pos + EVACUATION_SIZE >= 
header->write_pos)) {
       Debug("cache_init", "Head Pos: %" PRIu64 ", Rec Pos: %" PRIu64 ", 
Wrapped:%d", header->write_pos, recover_pos, recover_wrapped);
-      Warning("no valid directory found while recovering '%s', clearing", 
hash_id);
+      Warning("no valid directory found while recovering '%s', clearing", 
hash_text);
       goto Lclear;
     }
 
@@ -2063,7 +2063,7 @@ build_vol_hash_table(CacheHostRecord *cp)
     forvol[i % num_vols]++;
   // seed random number generator
   for (int i = 0; i < num_vols; i++) {
-    uint64_t x = p[i]->hash_id_md5.fold();
+    uint64_t x = p[i]->hash_id.fold();
     rnd[i] = (unsigned int) x;
   }
   // initialize table to "empty"
@@ -2365,7 +2365,7 @@ CacheVC::handleReadDone(int event, Event *e)
       if (!io.ok()) {
         Debug("cache_disk_error", "Read error on disk %s\n \
            read range : [%" PRIu64 " - %" PRIu64 " bytes]  [%" PRIu64 " - %" 
PRIu64 " blocks] \n",
-              vol->hash_id, (uint64_t)io.aiocb.aio_offset, 
(uint64_t)io.aiocb.aio_offset + io.aiocb.aio_nbytes,
+              vol->hash_text, (uint64_t)io.aiocb.aio_offset, 
(uint64_t)io.aiocb.aio_offset + io.aiocb.aio_nbytes,
               (uint64_t)io.aiocb.aio_offset / 512, 
(uint64_t)(io.aiocb.aio_offset + io.aiocb.aio_nbytes) / 512);
       }
       goto Ldone;
@@ -2638,7 +2638,7 @@ LmemHit:
 }
 
 Action *
-Cache::lookup(Continuation *cont, CacheKey *key, CacheFragType type, char 
*hostname, int host_len)
+Cache::lookup(Continuation *cont, CacheKey *key, CacheFragType type, char 
const* hostname, int host_len)
 {
   if (!CacheProcessor::IsCacheReady(type)) {
     cont->handleEvent(CACHE_EVENT_LOOKUP_FAILED, 0);
@@ -2667,12 +2667,12 @@ Cache::lookup(Continuation *cont, CacheKey *key, 
CacheFragType type, char *hostn
 Action *
 Cache::lookup(Continuation *cont, CacheURL *url, CacheFragType type)
 {
-  INK_MD5 md5;
+  CryptoHash id;
 
-  url->MD5_get(&md5);
+  url->hash_get(&id);
   int len = 0;
-  const char *hostname = url->host_get(&len);
-  return lookup(cont, &md5, type, (char *) hostname, len);
+  char const* hostname = url->host_get(&len);
+  return lookup(cont, &id, type, hostname, len);
 }
 
 int
@@ -3241,9 +3241,9 @@ rebuild_host_table(Cache *cache)
 
 // if generic_host_rec.vols == NULL, what do we do???
 Vol *
-Cache::key_to_vol(CacheKey *key, char *hostname, int host_len)
+Cache::key_to_vol(CacheKey *key, char const* hostname, int host_len)
 {
-  uint32_t h = (key->word(2) >> DIR_TAG_WIDTH) % VOL_HASH_TABLE_SIZE;
+  uint32_t h = (key->slice32(2) >> DIR_TAG_WIDTH) % VOL_HASH_TABLE_SIZE;
   unsigned short *hash_table = hosttable->gen_host_rec.vol_hash_table;
   CacheHostRecord *host_rec = &hosttable->gen_host_rec;
 
@@ -3487,23 +3487,23 @@ CacheProcessor::open_write(Continuation *cont, int 
expected_size, URL *url, bool
 Action *
 CacheProcessor::remove(Continuation *cont, URL *url, bool cluster_cache_local, 
CacheFragType frag_type)
 {
-  INK_MD5 md5;
+  CryptoHash id;
   int len = 0;
   const char *hostname;
 
-  url->MD5_get(&md5);
+  url->hash_get(&id);
   hostname = url->host_get(&len);
 
   Debug("cache_remove", "[CacheProcessor::remove] Issuing cache delete for 
%s", url->string_get_ref());
 #ifdef CLUSTER_CACHE
   if (cache_clustering_enabled > 0 && !cluster_cache_local) {
     // Remove from cluster
-    return remove(cont, &md5, cluster_cache_local, frag_type, true, false, 
const_cast<char *>(hostname), len);
+    return remove(cont, &id, cluster_cache_local, frag_type, true, false, 
const_cast<char *>(hostname), len);
   }
 #endif
 
   // Remove from local cache only.
-  return caches[frag_type]->remove(cont, &md5, frag_type, true, false, 
const_cast<char*>(hostname), len);
+  return caches[frag_type]->remove(cont, &id, frag_type, true, false, 
const_cast<char*>(hostname), len);
 }
 
 CacheDisk*

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheDir.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/CacheDir.cc b/iocore/cache/CacheDir.cc
index ba0fddc..18b3be6 100644
--- a/iocore/cache/CacheDir.cc
+++ b/iocore/cache/CacheDir.cc
@@ -69,7 +69,7 @@ int
 OpenDir::open_write(CacheVC *cont, int allow_if_writers, int max_writers)
 {
   ink_assert(cont->vol->mutex->thread_holding == this_ethread());
-  unsigned int h = cont->first_key.word(0);
+  unsigned int h = cont->first_key.slice32(0);
   int b = h % OPEN_DIR_BUCKETS;
   for (OpenDirEntry *d = bucket[b].head; d; d = d->link.next) {
     if (!(d->writers.head->first_key == cont->first_key))
@@ -133,7 +133,7 @@ OpenDir::close_write(CacheVC *cont)
   cont->od->writers.remove(cont);
   cont->od->num_writers--;
   if (!cont->od->writers.head) {
-    unsigned int h = cont->first_key.word(0);
+    unsigned int h = cont->first_key.slice32(0);
     int b = h % OPEN_DIR_BUCKETS;
     bucket[b].remove(cont->od);
     delayed_readers.append(cont->od->readers);
@@ -148,7 +148,7 @@ OpenDir::close_write(CacheVC *cont)
 OpenDirEntry *
 OpenDir::open_read(INK_MD5 *key)
 {
-  unsigned int h = key->word(0);
+  unsigned int h = key->slice32(0);
   int b = h % OPEN_DIR_BUCKETS;
   for (OpenDirEntry *d = bucket[b].head; d; d = d->link.next)
     if (d->writers.head->first_key == *key)
@@ -591,8 +591,8 @@ int
 dir_probe(CacheKey *key, Vol *d, Dir *result, Dir ** last_collision)
 {
   ink_assert(d->mutex->thread_holding == this_ethread());
-  int s = key->word(0) % d->segments;
-  int b = key->word(1) % d->buckets;
+  int s = key->slice32(0) % d->segments;
+  int b = key->slice32(1) % d->buckets;
   Dir *seg = dir_segment(s, d);
   Dir *e = NULL, *p = NULL, *collision = *last_collision;
   Vol *vol = d;
@@ -624,7 +624,7 @@ Lagain:
           goto Lcont;
         }
         if (dir_valid(d, e)) {
-          DDebug("dir_probe_hit", "found %X %X vol %d bucket %d boffset %" 
PRId64 "", key->word(0), key->word(1), d->fd, b, dir_offset(e));
+          DDebug("dir_probe_hit", "found %X %X vol %d bucket %d boffset %" 
PRId64 "", key->slice32(0), key->slice32(1), d->fd, b, dir_offset(e));
           dir_assign(result, e);
           *last_collision = e;
 #if !TS_USE_INTERIM_CACHE
@@ -637,7 +637,7 @@ Lagain:
           continue;
         }
       } else
-        DDebug("dir_probe_tag", "tag mismatch %p %X vs expected %X", e, 
dir_tag(e), key->word(3));
+        DDebug("dir_probe_tag", "tag mismatch %p %X vs expected %X", e, 
dir_tag(e), key->slice32(3));
     Lcont:
       p = e;
       e = next_dir(e, seg);
@@ -648,7 +648,7 @@ Lagain:
     collision = NULL;
     goto Lagain;
   }
-  DDebug("dir_probe_miss", "missed %X %X on vol %d bucket %d at %p", 
key->word(0), key->word(1), d->fd, b, seg);
+  DDebug("dir_probe_miss", "missed %X %X on vol %d bucket %d at %p", 
key->slice32(0), key->slice32(1), d->fd, b, seg);
   CHECK_DIR(d);
   return 0;
 }
@@ -657,15 +657,15 @@ int
 dir_insert(CacheKey *key, Vol *d, Dir *to_part)
 {
   ink_assert(d->mutex->thread_holding == this_ethread());
-  int s = key->word(0) % d->segments, l;
-  int bi = key->word(1) % d->buckets;
+  int s = key->slice32(0) % d->segments, l;
+  int bi = key->slice32(1) % d->buckets;
   ink_assert(dir_approx_size(to_part) <= MAX_FRAG_SIZE + sizeofDoc);
   Dir *seg = dir_segment(s, d);
   Dir *e = NULL;
   Dir *b = dir_bucket(bi, seg);
   Vol *vol = d;
 #if defined(DEBUG) && defined(DO_CHECK_DIR_FAST)
-  unsigned int t = DIR_MASK_TAG(key->word(2));
+  unsigned int t = DIR_MASK_TAG(key->slice32(2));
   Dir *col = b;
   while (col) {
     ink_assert((dir_tag(col) != t) || (dir_offset(col) != 
dir_offset(to_part)));
@@ -700,15 +700,15 @@ Llink:
 Lfill:
 #if TS_USE_INTERIM_CACHE == 1
   dir_assign_data(b, to_part);
-  dir_set_tag(b, key->word(2));
+  dir_set_tag(b, key->slice32(2));
 #else
   dir_assign_data(e, to_part);
-  dir_set_tag(e, key->word(2));
+  dir_set_tag(e, key->slice32(2));
   ink_assert(vol_offset(d, e) < (d->skip + d->len));
 #endif
   DDebug("dir_insert",
         "insert %p %X into vol %d bucket %d at %p tag %X %X boffset %" PRId64 
"",
-         e, key->word(0), d->fd, bi, e, key->word(1), dir_tag(e), 
dir_offset(e));
+         e, key->slice32(0), d->fd, bi, e, key->slice32(1), dir_tag(e), 
dir_offset(e));
   CHECK_DIR(d);
   d->header->dirty = 1;
   CACHE_INC_DIR_USED(d->mutex);
@@ -719,12 +719,12 @@ int
 dir_overwrite(CacheKey *key, Vol *d, Dir *dir, Dir *overwrite, bool 
must_overwrite)
 {
   ink_assert(d->mutex->thread_holding == this_ethread());
-  int s = key->word(0) % d->segments, l;
-  int bi = key->word(1) % d->buckets;
+  int s = key->slice32(0) % d->segments, l;
+  int bi = key->slice32(1) % d->buckets;
   Dir *seg = dir_segment(s, d);
   Dir *e = NULL;
   Dir *b = dir_bucket(bi, seg);
-  unsigned int t = DIR_MASK_TAG(key->word(2));
+  unsigned int t = DIR_MASK_TAG(key->slice32(2));
   int res = 1;
 #ifdef LOOP_CHECK_MODE
   int loop_count = 0;
@@ -786,7 +786,7 @@ Lfill:
   ink_assert(vol_offset(d, e) < d->skip + d->len);
   DDebug("dir_overwrite",
         "overwrite %p %X into vol %d bucket %d at %p tag %X %X boffset %" 
PRId64 "",
-         e, key->word(0), d->fd, bi, e, t, dir_tag(e), dir_offset(e));
+         e, key->slice32(0), d->fd, bi, e, t, dir_tag(e), dir_offset(e));
   CHECK_DIR(d);
   d->header->dirty = 1;
   return res;
@@ -796,8 +796,8 @@ int
 dir_delete(CacheKey *key, Vol *d, Dir *del)
 {
   ink_assert(d->mutex->thread_holding == this_ethread());
-  int s = key->word(0) % d->segments;
-  int b = key->word(1) % d->buckets;
+  int s = key->slice32(0) % d->segments;
+  int b = key->slice32(1) % d->buckets;
   Dir *seg = dir_segment(s, d);
   Dir *e = NULL, *p = NULL;
 #ifdef LOOP_CHECK_MODE
@@ -839,13 +839,13 @@ int
 dir_lookaside_probe(CacheKey *key, Vol *d, Dir *result, EvacuationBlock ** 
eblock)
 {
   ink_assert(d->mutex->thread_holding == this_ethread());
-  int i = key->word(3) % LOOKASIDE_SIZE;
+  int i = key->slice32(3) % LOOKASIDE_SIZE;
   EvacuationBlock *b = d->lookaside[i].head;
   while (b) {
     if (b->evac_frags.key == *key) {
       if (dir_valid(d, &b->new_dir)) {
         *result = b->new_dir;
-        DDebug("dir_lookaside", "probe %X success", key->word(0));
+        DDebug("dir_lookaside", "probe %X success", key->slice32(0));
         if (eblock)
           *eblock = b;
         return 1;
@@ -853,7 +853,7 @@ dir_lookaside_probe(CacheKey *key, Vol *d, Dir *result, 
EvacuationBlock ** ebloc
     }
     b = b->link.next;
   }
-  DDebug("dir_lookaside", "probe %X failed", key->word(0));
+  DDebug("dir_lookaside", "probe %X failed", key->slice32(0));
   return 0;
 }
 
@@ -861,9 +861,9 @@ int
 dir_lookaside_insert(EvacuationBlock *eblock, Vol *d, Dir *to)
 {
   CacheKey *key = &eblock->evac_frags.earliest_key;
-  DDebug("dir_lookaside", "insert %X %X, offset %d phase %d", key->word(0), 
key->word(1), (int) dir_offset(to), (int) dir_phase(to));
+  DDebug("dir_lookaside", "insert %X %X, offset %d phase %d", key->slice32(0), 
key->slice32(1), (int) dir_offset(to), (int) dir_phase(to));
   ink_assert(d->mutex->thread_holding == this_ethread());
-  int i = key->word(3) % LOOKASIDE_SIZE;
+  int i = key->slice32(3) % LOOKASIDE_SIZE;
   EvacuationBlock *b = new_EvacuationBlock(d->mutex->thread_holding);
   b->evac_frags.key = *key;
   b->evac_frags.earliest_key = *key;
@@ -879,13 +879,13 @@ int
 dir_lookaside_fixup(CacheKey *key, Vol *d)
 {
   ink_assert(d->mutex->thread_holding == this_ethread());
-  int i = key->word(3) % LOOKASIDE_SIZE;
+  int i = key->slice32(3) % LOOKASIDE_SIZE;
   EvacuationBlock *b = d->lookaside[i].head;
   while (b) {
     if (b->evac_frags.key == *key) {
       int res = dir_overwrite(key, d, &b->new_dir, &b->dir, false);
       DDebug("dir_lookaside", "fixup %X %X offset %" PRId64" phase %d %d",
-            key->word(0), key->word(1), dir_offset(&b->new_dir), 
dir_phase(&b->new_dir), res);
+            key->slice32(0), key->slice32(1), dir_offset(&b->new_dir), 
dir_phase(&b->new_dir), res);
 #if TS_USE_INTERIM_CACHE == 1
       int64_t o = dir_get_offset(&b->dir), n = dir_get_offset(&b->new_dir);
 #else
@@ -898,7 +898,7 @@ dir_lookaside_fixup(CacheKey *key, Vol *d)
     }
     b = b->link.next;
   }
-  DDebug("dir_lookaside", "fixup %X %X failed", key->word(0), key->word(1));
+  DDebug("dir_lookaside", "fixup %X %X failed", key->slice32(0), 
key->slice32(1));
   return 0;
 }
 
@@ -912,7 +912,7 @@ dir_lookaside_cleanup(Vol *d)
       if (!dir_valid(d, &b->new_dir)) {
         EvacuationBlock *nb = b->link.next;
         DDebug("dir_lookaside", "cleanup %X %X cleaned up",
-              b->evac_frags.earliest_key.word(0), 
b->evac_frags.earliest_key.word(1));
+              b->evac_frags.earliest_key.slice32(0), 
b->evac_frags.earliest_key.slice32(1));
         d->lookaside[i].remove(b);
         free_CacheVC(b->earliest_evacuator);
         free_EvacuationBlock(b, d->mutex->thread_holding);
@@ -929,19 +929,19 @@ void
 dir_lookaside_remove(CacheKey *key, Vol *d)
 {
   ink_assert(d->mutex->thread_holding == this_ethread());
-  int i = key->word(3) % LOOKASIDE_SIZE;
+  int i = key->slice32(3) % LOOKASIDE_SIZE;
   EvacuationBlock *b = d->lookaside[i].head;
   while (b) {
     if (b->evac_frags.key == *key) {
       DDebug("dir_lookaside", "remove %X %X offset %" PRId64" phase %d",
-            key->word(0), key->word(1), dir_offset(&b->new_dir), 
dir_phase(&b->new_dir));
+            key->slice32(0), key->slice32(1), dir_offset(&b->new_dir), 
dir_phase(&b->new_dir));
       d->lookaside[i].remove(b);
       free_EvacuationBlock(b, d->mutex->thread_holding);
       return;
     }
     b = b->link.next;
   }
-  DDebug("dir_lookaside", "remove %X %X failed", key->word(0), key->word(1));
+  DDebug("dir_lookaside", "remove %X %X failed", key->slice32(0), 
key->slice32(1));
   return;
 }
 
@@ -1015,13 +1015,13 @@ sync_cache_dir_on_shutdown(void)
     Vol *d = gvol[i];
 
     if (DISK_BAD(d->disk)) {
-      Debug("cache_dir_sync", "Dir %s: ignoring -- bad disk", d->hash_id);
+      Debug("cache_dir_sync", "Dir %s: ignoring -- bad disk", d->hash_text);
       continue;
     }
     size_t dirlen = vol_dirlen(d);
     ink_assert(dirlen > 0); // make clang happy - if not > 0 the vol is 
seriously messed up
     if (!d->header->dirty && !d->dir_sync_in_progress) {
-      Debug("cache_dir_sync", "Dir %s: ignoring -- not dirty", d->hash_id);
+      Debug("cache_dir_sync", "Dir %s: ignoring -- not dirty", d->hash_text);
       continue;
     }
     // recompute hit_evacuate_window
@@ -1032,7 +1032,7 @@ sync_cache_dir_on_shutdown(void)
     // dont worry about the cachevc s in the agg queue
     // directories have not been inserted for these writes
     if (d->agg_buf_pos) {
-      Debug("cache_dir_sync", "Dir %s: flushing agg buffer first", d->hash_id);
+      Debug("cache_dir_sync", "Dir %s: flushing agg buffer first", 
d->hash_text);
 
       // set write limit
       d->header->agg_pos = d->header->write_pos + d->agg_buf_pos;
@@ -1054,7 +1054,7 @@ sync_cache_dir_on_shutdown(void)
     for (int i = 0; i < d->num_interim_vols; i++) {
       InterimCacheVol *sv = &(d->interim_vols[i]);
       if (sv->agg_buf_pos) {
-        Debug("cache_dir_sync", "Dir %s: flushing agg buffer first to 
interim", d->hash_id);
+        Debug("cache_dir_sync", "Dir %s: flushing agg buffer first to 
interim", d->hash_text);
         sv->header->agg_pos = sv->header->write_pos + sv->agg_buf_pos;
 
         int r = pwrite(sv->fd, sv->agg_buffer, sv->agg_buf_pos, 
sv->header->write_pos);
@@ -1096,7 +1096,7 @@ sync_cache_dir_on_shutdown(void)
     off_t start = d->skip + (B ? dirlen : 0);
     B = pwrite(d->fd, buf, dirlen, start);
     ink_assert(B == dirlen);
-    Debug("cache_dir_sync", "done syncing dir for vol %s", d->hash_id);
+    Debug("cache_dir_sync", "done syncing dir for vol %s", d->hash_text);
   }
   Debug("cache_dir_sync", "sync done");
   if (buf)
@@ -1131,7 +1131,7 @@ Lrestart:
   if (event == AIO_EVENT_DONE) {
     // AIO Thread
     if (io.aio_result != (int64_t)io.aiocb.aio_nbytes) {
-      Warning("vol write error during directory sync '%s'", 
gvol[vol]->hash_id);
+      Warning("vol write error during directory sync '%s'", 
gvol[vol]->hash_text);
       event = EVENT_NONE;
       goto Ldone;
     }
@@ -1164,11 +1164,11 @@ Lrestart:
          The dirty bit it set in dir_insert, dir_overwrite and dir_delete_entry
        */
       if (!d->header->dirty) {
-        Debug("cache_dir_sync", "Dir %s not dirty", d->hash_id);
+        Debug("cache_dir_sync", "Dir %s not dirty", d->hash_text);
         goto Ldone;
       }
       if (d->is_io_in_progress() || d->agg_buf_pos) {
-        Debug("cache_dir_sync", "Dir %s: waiting for agg buffer", d->hash_id);
+        Debug("cache_dir_sync", "Dir %s: waiting for agg buffer", 
d->hash_text);
         d->dir_sync_waiting = 1;
         if (!d->is_io_in_progress())
           d->aggWrite(EVENT_IMMEDIATE, 0);
@@ -1182,7 +1182,7 @@ Lrestart:
 #endif
         return EVENT_CONT;
       }
-      Debug("cache_dir_sync", "pos: %" PRIu64 " Dir %s dirty...syncing to 
disk", d->header->write_pos, d->hash_id);
+      Debug("cache_dir_sync", "pos: %" PRIu64 " Dir %s dirty...syncing to 
disk", d->header->write_pos, d->hash_text);
       d->header->dirty = 0;
       if (buflen < dirlen) {
         if (buf)
@@ -1276,7 +1276,7 @@ Vol::dir_check(bool /* fix ATS_UNUSED */) // TODO: we 
should eliminate this para
     free += dir_freelist_length(this, s);
   }
   int total = buckets * segments * DIR_DEPTH;
-  printf("    Directory for [%s]\n", hash_id);
+  printf("    Directory for [%s]\n", hash_text);
   printf("        Bytes:     %d\n", total * SIZEOF_DIR);
   printf("        Segments:  %" PRIu64 "\n", (uint64_t)segments);
   printf("        Buckets:   %" PRIu64 "\n", (uint64_t)buckets);
@@ -1446,7 +1446,7 @@ EXCLUSIVE_REGRESSION_TEST(Cache_dir) (RegressionTest *t, 
int /* atype ATS_UNUSED
   CacheKey key;
   rand_CacheKey(&key, thread->mutex);
 
-  int s = key.word(0) % d->segments, i, j;
+  int s = key.slice32(0) % d->segments, i, j;
   Dir *seg = dir_segment(s, d);
 
   // test insert
@@ -1518,8 +1518,8 @@ EXCLUSIVE_REGRESSION_TEST(Cache_dir) (RegressionTest *t, 
int /* atype ATS_UNUSED
 #ifdef LOOP_CHECK_MODE
     // dir_probe in bucket with loop
     rand_CacheKey(&key, thread->mutex);
-    s1 = key.word(0) % d->segments;
-    b1 = key.word(1) % d->buckets;
+    s1 = key.slice32(0) % d->segments;
+    b1 = key.slice32(1) % d->buckets;
     dir_corrupt_bucket(dir_bucket(b1, dir_segment(s1, d)), s1, d);
     dir_insert(&key, d, &dir);
     Dir *last_collision = 0;
@@ -1527,8 +1527,8 @@ EXCLUSIVE_REGRESSION_TEST(Cache_dir) (RegressionTest *t, 
int /* atype ATS_UNUSED
 
 
     rand_CacheKey(&key, thread->mutex);
-    s1 = key.word(0) % d->segments;
-    b1 = key.word(1) % d->buckets;
+    s1 = key.slice32(0) % d->segments;
+    b1 = key.slice32(1) % d->buckets;
     dir_corrupt_bucket(dir_bucket(b1, dir_segment(s1, d)), s1, d);
 
     last_collision = 0;
@@ -1536,8 +1536,8 @@ EXCLUSIVE_REGRESSION_TEST(Cache_dir) (RegressionTest *t, 
int /* atype ATS_UNUSED
 
     // dir_overwrite in bucket with loop
     rand_CacheKey(&key, thread->mutex);
-    s1 = key.word(0) % d->segments;
-    b1 = key.word(1) % d->buckets;
+    s1 = key.slice32(0) % d->segments;
+    b1 = key.slice32(1) % d->buckets;
     CacheKey key1;
     key1.b[1] = 127;
     dir1 = dir;
@@ -1550,23 +1550,23 @@ EXCLUSIVE_REGRESSION_TEST(Cache_dir) (RegressionTest 
*t, int /* atype ATS_UNUSED
     dir_overwrite(&key, d, &dir, &dir, 1);
 
     rand_CacheKey(&key, thread->mutex);
-    s1 = key.word(0) % d->segments;
-    b1 = key.word(1) % d->buckets;
+    s1 = key.slice32(0) % d->segments;
+    b1 = key.slice32(1) % d->buckets;
     key.b[1] = 23;
     dir_insert(&key, d, &dir1);
     dir_corrupt_bucket(dir_bucket(b1, dir_segment(s1, d)), s1, d);
     dir_overwrite(&key, d, &dir, &dir, 0);
 
     rand_CacheKey(&key, thread->mutex);
-    s1 = key.word(0) % d->segments;
+    s1 = key.slice32(0) % d->segments;
     Dir *seg1 = dir_segment(s1, d);
     // dir_freelist_length in freelist with loop
     dir_corrupt_bucket(dir_from_offset(d->header->freelist[s], seg1), s1, d);
     dir_freelist_length(d, s1);
 
     rand_CacheKey(&key, thread->mutex);
-    s1 = key.word(0) % d->segments;
-    b1 = key.word(1) % d->buckets;
+    s1 = key.slice32(0) % d->segments;
+    b1 = key.slice32(1) % d->buckets;
     // dir_bucket_length in bucket with loop
     dir_corrupt_bucket(dir_bucket(b1, dir_segment(s1, d)), s1, d);
     dir_bucket_length(dir_bucket(b1, dir_segment(s1, d)), s1, d);
@@ -1575,8 +1575,8 @@ EXCLUSIVE_REGRESSION_TEST(Cache_dir) (RegressionTest *t, 
int /* atype ATS_UNUSED
 #else
     // test corruption detection
     rand_CacheKey(&key, thread->mutex);
-    s1 = key.word(0) % d->segments;
-    b1 = key.word(1) % d->buckets;
+    s1 = key.slice32(0) % d->segments;
+    b1 = key.slice32(1) % d->buckets;
 
     dir_insert(&key, d, &dir1);
     dir_insert(&key, d, &dir1);

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheHosting.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/CacheHosting.cc b/iocore/cache/CacheHosting.cc
index 2d2f3b2..3c7395b 100644
--- a/iocore/cache/CacheHosting.cc
+++ b/iocore/cache/CacheHosting.cc
@@ -101,7 +101,7 @@ CacheHostMatcher::AllocateSpace(int num_entries)
 //    arg hostname
 //
 void
-CacheHostMatcher::Match(char *rdata, int rlen, CacheHostResult * result)
+CacheHostMatcher::Match(char const* rdata, int rlen, CacheHostResult * result)
 {
 
   void *opaque_ptr;
@@ -233,7 +233,7 @@ CacheHostTable::Print()
 //   Queries each table for the Result*
 //
 void
-CacheHostTable::Match(char *rdata, int rlen, CacheHostResult * result)
+CacheHostTable::Match(char const* rdata, int rlen, CacheHostResult * result)
 {
 
   hostMatch->Match(rdata, rlen, result);

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheHttp.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/CacheHttp.cc b/iocore/cache/CacheHttp.cc
index e07698c..6bcc4fc 100644
--- a/iocore/cache/CacheHttp.cc
+++ b/iocore/cache/CacheHttp.cc
@@ -154,7 +154,7 @@ CacheHTTPInfoVector::print(char *buffer, size_t buf_size, 
bool temps)
 
       if (temps || !(data[i].alternate.object_key_get() == zero_key)) {
         snprintf(p, buf_size, "[%d %s]", data[i].alternate.id_get(),
-                     CacheKey(data[i].alternate.object_key_get()).string(buf));
+                     
CacheKey(data[i].alternate.object_key_get()).toHexStr(buf));
         tmp = strlen(p);
         p += tmp;
         buf_size -= tmp;

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CachePages.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/CachePages.cc b/iocore/cache/CachePages.cc
index 2f0e57a..c35f4f2 100644
--- a/iocore/cache/CachePages.cc
+++ b/iocore/cache/CachePages.cc
@@ -318,8 +318,8 @@ ShowCache::handleCacheEvent(int event, Event *e) {
         CHECK_SHOW(show("<P><TABLE border=1 width=100%%>"));
         CHECK_SHOW(show("<TR><TH bgcolor=\"#FFF0E0\" 
colspan=2>Doc</TH></TR>\n"));
         CHECK_SHOW(show("<TR><TD>Volume</td> <td>#%d - 
store='%s'</td></tr>\n", cache_vc->vol->cache_vol->vol_number, 
cache_vc->vol->path));
-        CHECK_SHOW(show("<TR><TD>first key</td> <td>%s</td></tr>\n", 
d->first_key.string(tmpstr)));
-        CHECK_SHOW(show("<TR><TD>key</td> <td>%s</td></tr>\n", 
d->key.string(tmpstr)));
+        CHECK_SHOW(show("<TR><TD>first key</td> <td>%s</td></tr>\n", 
d->first_key.toHexStr(tmpstr)));
+        CHECK_SHOW(show("<TR><TD>key</td> <td>%s</td></tr>\n", 
d->key.toHexStr(tmpstr)));
         CHECK_SHOW(show("<tr><td>sync_serial</td><td>%lu</tr>\n", 
d->sync_serial));
         CHECK_SHOW(show("<tr><td>write_serial</td><td>%lu</tr>\n", 
d->write_serial));
         CHECK_SHOW(show("<tr><td>header length</td><td>%lu</tr>\n", d->hlen));
@@ -371,7 +371,7 @@ ShowCache::handleCacheEvent(int event, Event *e) {
           } while (!done);
           CHECK_SHOW(show("</PRE></td></tr>\n"));
           CHECK_SHOW(show("<tr><td>Size</td><td>%" PRId64 "</td>\n", 
obj_size));
-          CHECK_SHOW(show("<tr><td>Key</td><td>%s</td>\n", 
obj_key.string(tmpstr)));
+          CHECK_SHOW(show("<tr><td>Key</td><td>%s</td>\n", 
obj_key.toHexStr(tmpstr)));
           t = obj->request_sent_time_get();
           ink_ctime_r(&t, tmpstr);
           CHECK_SHOW(show("<tr><td>Request sent time</td><td>%s</td></tr>\n", 
tmpstr));
@@ -418,7 +418,7 @@ ShowCache::lookup_url(int event, Event *e) {
   url.parse(&s, s + strlen(s));
   INK_MD5 md5;
   int len;
-  url.MD5_get(&md5);
+  url.hash_get(&md5);
   const char *hostname = url.host_get(&len);
   SET_HANDLER(&ShowCache::handleCacheEvent);
   Action *lookup_result = cacheProcessor.open_read(this, &md5, 
getClusterCacheLocal(&url, (char *)hostname), CACHE_FRAG_TYPE_HTTP, (char *) 
hostname, len);

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheRead.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/CacheRead.cc b/iocore/cache/CacheRead.cc
index e1e5542..5b3d071 100644
--- a/iocore/cache/CacheRead.cc
+++ b/iocore/cache/CacheRead.cc
@@ -256,14 +256,14 @@ CacheVC::openReadChooseWriter(int /* event ATS_UNUSED */, 
Event * /* e ATS_UNUSE
     }
     vector.clear(false);
     if (!write_vc) {
-      DDebug("cache_read_agg", "%p: key: %X writer alternate different: %d", 
this, first_key.word(1), alternate_index);
+      DDebug("cache_read_agg", "%p: key: %X writer alternate different: %d", 
this, first_key.slice32(1), alternate_index);
       od = NULL;
       return EVENT_RETURN;
     }
 
     DDebug("cache_read_agg",
           "%p: key: %X eKey: %d # alts: %d, ndx: %d, # writers: %d writer: %p",
-          this, first_key.word(1), write_vc->earliest_key.word(1),
+          this, first_key.slice32(1), write_vc->earliest_key.slice32(1),
           vector.count(), alternate_index, od->num_writers, write_vc);
   }
 #endif //HTTP_CACHE
@@ -287,7 +287,7 @@ CacheVC::openReadFromWriter(int event, Event * e)
   }
   cancel_trigger();
   intptr_t err = ECACHE_DOC_BUSY;
-  DDebug("cache_read_agg", "%p: key: %X In openReadFromWriter", this, 
first_key.word(1));
+  DDebug("cache_read_agg", "%p: key: %X In openReadFromWriter", this, 
first_key.slice32(1));
 #ifndef READ_WHILE_WRITER
   return openReadFromWriterFailure(CACHE_EVENT_OPEN_READ_FAILED, (Event *) 
-err);
 #else
@@ -325,7 +325,7 @@ CacheVC::openReadFromWriter(int event, Event * e)
     if (writer_done()) {
       MUTEX_RELEASE(lock);
       DDebug("cache_read_agg",
-            "%p: key: %X writer %p has left, continuing as normal read", this, 
first_key.word(1), write_vc);
+            "%p: key: %X writer %p has left, continuing as normal read", this, 
first_key.slice32(1), write_vc);
       od = NULL;
       write_vc = NULL;
       SET_HANDLER(&CacheVC::openReadStartHead);
@@ -353,13 +353,13 @@ CacheVC::openReadFromWriter(int event, Event * e)
     }
     DDebug("cache_read_agg",
           "%p: key: %X writer: closed:%d, fragment:%d, retry: %d",
-          this, first_key.word(1), write_vc->closed, write_vc->fragment, 
writer_lock_retry);
+          this, first_key.slice32(1), write_vc->closed, write_vc->fragment, 
writer_lock_retry);
     VC_SCHED_WRITER_RETRY();
   }
 
   CACHE_TRY_LOCK(writer_lock, write_vc->mutex, mutex->thread_holding);
   if (!writer_lock) {
-    DDebug("cache_read_agg", "%p: key: %X lock miss", this, first_key.word(1));
+    DDebug("cache_read_agg", "%p: key: %X lock miss", this, 
first_key.slice32(1));
     VC_SCHED_LOCK_RETRY();
   }
   MUTEX_RELEASE(lock);
@@ -370,7 +370,7 @@ CacheVC::openReadFromWriter(int event, Event * e)
   if (frag_type == CACHE_FRAG_TYPE_HTTP) {
     DDebug("cache_read_agg",
           "%p: key: %X http passed stage 1, closed: %d, frag: %d",
-          this, first_key.word(1), write_vc->closed, write_vc->fragment);
+          this, first_key.slice32(1), write_vc->closed, write_vc->fragment);
     if (!write_vc->alternate.valid())
       return openReadFromWriterFailure(CACHE_EVENT_OPEN_READ_FAILED, (Event *) 
- err);
     alternate.copy(&write_vc->alternate);
@@ -386,7 +386,7 @@ CacheVC::openReadFromWriter(int event, Event * e)
     } else {
       key = write_vc->update_key;
       ink_assert(write_vc->closed);
-      DDebug("cache_read_agg", "%p: key: %X writer header update", this, 
first_key.word(1));
+      DDebug("cache_read_agg", "%p: key: %X writer header update", this, 
first_key.slice32(1));
       // Update case (b) : grab doc_len from the writer's alternate
       doc_len = alternate.object_size_get();
       if (write_vc->update_key == cod->single_doc_key &&
@@ -417,7 +417,7 @@ CacheVC::openReadFromWriter(int event, Event * e)
     }
   } else {
 #endif //HTTP_CACHE
-    DDebug("cache_read_agg", "%p: key: %X non-http passed stage 1", this, 
first_key.word(1));
+    DDebug("cache_read_agg", "%p: key: %X non-http passed stage 1", this, 
first_key.slice32(1));
     key = write_vc->earliest_key;
 #ifdef HTTP_CACHE
   }
@@ -427,7 +427,7 @@ CacheVC::openReadFromWriter(int event, Event * e)
     last_collision = NULL;
     DDebug("cache_read_agg",
           "%p: key: %X closed: %d, fragment: %d, len: %d starting first 
fragment",
-          this, first_key.word(1), write_vc->closed, write_vc->fragment, 
(int)doc_len);
+          this, first_key.slice32(1), write_vc->closed, write_vc->fragment, 
(int)doc_len);
     MUTEX_RELEASE(writer_lock);
     // either a header + body update or a new document
     SET_HANDLER(&CacheVC::openReadStartEarliest);
@@ -444,7 +444,7 @@ CacheVC::openReadFromWriter(int event, Event * e)
   doc_len = write_vc->total_len;
   dir_clean(&first_dir);
   dir_clean(&earliest_dir);
-  DDebug("cache_read_agg", "%p: key: %X %X: single fragment read", this, 
first_key.word(1), key.word(0));
+  DDebug("cache_read_agg", "%p: key: %X %X: single fragment read", this, 
first_key.slice32(1), key.slice32(0));
   MUTEX_RELEASE(writer_lock);
   SET_HANDLER(&CacheVC::openReadFromWriterMain);
   CACHE_INCREMENT_DYN_STAT(cache_read_busy_success_stat);
@@ -465,11 +465,11 @@ CacheVC::openReadFromWriterMain(int /* event ATS_UNUSED 
*/, Event * /* e ATS_UNU
   if (ntodo <= 0)
     return EVENT_CONT;
   if (length < ((int64_t)doc_len) - vio.ndone) {
-    DDebug("cache_read_agg", "truncation %X", first_key.word(1));
+    DDebug("cache_read_agg", "truncation %X", first_key.slice32(1));
     if (is_action_tag_set("cache")) {
       ink_release_assert(false);
     }
-    Warning("Document %X truncated at %d of %d, reading from writer", 
first_key.word(1), (int)vio.ndone, (int)doc_len);
+    Warning("Document %X truncated at %d of %d, reading from writer", 
first_key.slice32(1), (int)vio.ndone, (int)doc_len);
     return calluser(VC_EVENT_ERROR);
   }
   /* its possible that the user did a do_io_close before
@@ -544,9 +544,9 @@ CacheVC::openReadReadDone(int event, Event * e)
       if (doc->magic != DOC_MAGIC) {
         char tmpstring[100];
         if (doc->magic == DOC_CORRUPT)
-          Warning("Middle: Doc checksum does not match for %s", 
key.string(tmpstring));
+          Warning("Middle: Doc checksum does not match for %s", 
key.toHexStr(tmpstring));
         else
-          Warning("Middle: Doc magic does not match for %s", 
key.string(tmpstring));
+          Warning("Middle: Doc magic does not match for %s", 
key.toHexStr(tmpstring));
 #if TS_USE_INTERIM_CACHE == 1
         if (dir_ininterim(&dir)) {
           dir_delete(&key, vol, &dir);
@@ -587,23 +587,23 @@ Lread:
           if (dir_offset(&dir) == dir_offset(&earliest_dir)) {
 #endif
             DDebug("cache_read_agg", "%p: key: %X ReadRead complete: %d",
-                  this, first_key.word(1), (int)vio.ndone);
+                  this, first_key.slice32(1), (int)vio.ndone);
             doc_len = vio.ndone;
             goto Ldone;
           }
         }
         DDebug("cache_read_agg", "%p: key: %X ReadRead writer aborted: %d",
-              this, first_key.word(1), (int)vio.ndone);
+              this, first_key.slice32(1), (int)vio.ndone);
         goto Lerror;
       }
-      DDebug("cache_read_agg", "%p: key: %X ReadRead retrying: %d", this, 
first_key.word(1), (int)vio.ndone);
+      DDebug("cache_read_agg", "%p: key: %X ReadRead retrying: %d", this, 
first_key.slice32(1), (int)vio.ndone);
       VC_SCHED_WRITER_RETRY(); // wait for writer
     }
     // fall through for truncated documents
   }
 Lerror:
   char tmpstring[100];
-  Warning("Document %s truncated", earliest_key.string(tmpstring));
+  Warning("Document %s truncated", earliest_key.toHexStr(tmpstring));
   return calluser(VC_EVENT_ERROR);
 Ldone:
   return calluser(VC_EVENT_EOS);
@@ -752,22 +752,22 @@ Lread: {
         while (dir_probe(&earliest_key, vol, &dir, &last_collision)) {
           if (dir_offset(&dir) == dir_offset(&earliest_dir)) {
             DDebug("cache_read_agg", "%p: key: %X ReadMain complete: %d",
-                  this, first_key.word(1), (int)vio.ndone);
+                  this, first_key.slice32(1), (int)vio.ndone);
             doc_len = vio.ndone;
             goto Leos;
           }
         }
         DDebug("cache_read_agg", "%p: key: %X ReadMain writer aborted: %d",
-              this, first_key.word(1), (int)vio.ndone);
+              this, first_key.slice32(1), (int)vio.ndone);
         goto Lerror;
       }
-      DDebug("cache_read_agg", "%p: key: %X ReadMain retrying: %d", this, 
first_key.word(1), (int)vio.ndone);
+      DDebug("cache_read_agg", "%p: key: %X ReadMain retrying: %d", this, 
first_key.slice32(1), (int)vio.ndone);
       SET_HANDLER(&CacheVC::openReadMain);
       VC_SCHED_WRITER_RETRY();
     }
     if (is_action_tag_set("cache"))
       ink_release_assert(false);
-    Warning("Document %X truncated at %d of %d, missing fragment %X", 
first_key.word(1), (int)vio.ndone, (int)doc_len, key.word(1));
+    Warning("Document %X truncated at %d of %d, missing fragment %X", 
first_key.slice32(1), (int)vio.ndone, (int)doc_len, key.slice32(1));
     // remove the directory entry
     dir_delete(&earliest_key, vol, &earliest_dir);
   }
@@ -815,9 +815,9 @@ CacheVC::openReadStartEarliest(int /* event ATS_UNUSED */, 
Event * /* e ATS_UNUS
         ink_release_assert(false);
       }
       if (doc->magic == DOC_CORRUPT)
-        Warning("Earliest: Doc checksum does not match for %s", 
key.string(tmpstring));
+        Warning("Earliest: Doc checksum does not match for %s", 
key.toHexStr(tmpstring));
       else
-        Warning("Earliest : Doc magic does not match for %s", 
key.string(tmpstring));
+        Warning("Earliest : Doc magic does not match for %s", 
key.toHexStr(tmpstring));
       // remove the dir entry
       dir_delete(&key, vol, &dir);
       // try going through the directory entries again
@@ -911,7 +911,7 @@ Lread:
             od->move_resident_alt = 1;
             od->single_doc_key = doc1->key;
             dir_assign(&od->single_doc_dir, &dir);
-            dir_set_tag(&od->single_doc_dir, od->single_doc_key.word(2));
+            dir_set_tag(&od->single_doc_dir, od->single_doc_key.slice32(2));
           }
           SET_HANDLER(&CacheVC::openReadVecWrite);
           if ((ret = do_write_call()) == EVENT_RETURN)
@@ -1031,9 +1031,9 @@ CacheVC::openReadStartHead(int event, Event * e)
         ink_release_assert(false);
       }
       if (doc->magic == DOC_CORRUPT)
-        Warning("Head: Doc checksum does not match for %s", 
key.string(tmpstring));
+        Warning("Head: Doc checksum does not match for %s", 
key.toHexStr(tmpstring));
       else
-        Warning("Head : Doc magic does not match for %s", 
key.string(tmpstring));
+        Warning("Head : Doc magic does not match for %s", 
key.toHexStr(tmpstring));
       // remove the dir entry
       dir_delete(&key, vol, &dir);
       // try going through the directory entries again
@@ -1079,7 +1079,7 @@ CacheVC::openReadStartHead(int event, Event * e)
                "unmarshalled %d expecting %d in %d (base=%d, flen=%d) "
                "- vector n=%d size=%d"
                "first alt=%d[%s]"
-               , key.word(0)
+               , key.slice32(0)
                , uml, doc->hlen, doc->len, sizeofDoc, doc->_flen
                , vector.count(), alt_length
                , alt->m_magic
@@ -1104,7 +1104,7 @@ CacheVC::openReadStartHead(int event, Event * e)
       alternate_tmp = vector.get(alternate_index);
       if (!alternate_tmp->valid()) {
         if (buf) {
-          Note("OpenReadHead failed for cachekey %X : alternate 
inconsistency", key.word(0));
+          Note("OpenReadHead failed for cachekey %X : alternate 
inconsistency", key.slice32(0));
           dir_delete(&key, vol, &dir);
         }
         goto Ldone;

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheTest.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/CacheTest.cc b/iocore/cache/CacheTest.cc
index 3c601ca..2bb1194 100644
--- a/iocore/cache/CacheTest.cc
+++ b/iocore/cache/CacheTest.cc
@@ -446,7 +446,7 @@ 
REGRESSION_TEST(cache_disk_replacement_stability)(RegressionTest *t, int level,
     vols[i].len = DEFAULT_STRIPE_SIZE;
     snprintf(buff, sizeof(buff), "/dev/sd%c %" PRIu64 ":%" PRIu64,
              'a' + i, DEFAULT_SKIP, vols[i].len);
-    vols[i].hash_id_md5.encodeBuffer(buff, strlen(buff));
+    MD5Context().hash_immediate(vols[i].hash_id, buff, strlen(buff));
   }
 
   hr1.vol_hash_table = 0;
@@ -462,7 +462,7 @@ 
REGRESSION_TEST(cache_disk_replacement_stability)(RegressionTest *t, int level,
   sample->len = 1024ULL * 1024 * 1024 * (1024+128); // 1.1 TB
   snprintf(buff, sizeof(buff), "/dev/sd%c %" PRIu64 ":%" PRIu64,
            'a' + sample_idx, DEFAULT_SKIP, sample->len);
-  sample->hash_id_md5.encodeBuffer(buff, strlen(buff));
+  MD5Context().hash_immediate(sample->hash_id, buff, strlen(buff));
   build_vol_hash_table(&hr2);
 
   // See what the difference is

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheVol.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/CacheVol.cc b/iocore/cache/CacheVol.cc
index 9fb690c..07d6199 100644
--- a/iocore/cache/CacheVol.cc
+++ b/iocore/cache/CacheVol.cc
@@ -438,7 +438,7 @@ CacheVC::scanOpenWrite(int /* event ATS_UNUSED */, Event * 
/* e ATS_UNUSED */)
     dir_assign(&od->first_dir, &dir);
     if (doc->total_len) {
       dir_assign(&od->single_doc_dir, &dir);
-      dir_set_tag(&od->single_doc_dir, doc->key.word(2));
+      dir_set_tag(&od->single_doc_dir, doc->key.slice32(2));
       od->single_doc_key = doc->key;
       od->move_resident_alt = 1;
     }

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/CacheWrite.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/CacheWrite.cc b/iocore/cache/CacheWrite.cc
index ee2160f..7108fde 100644
--- a/iocore/cache/CacheWrite.cc
+++ b/iocore/cache/CacheWrite.cc
@@ -42,7 +42,7 @@ get_alternate_index(CacheHTTPInfoVector *cache_vector, 
CacheKey key)
   for (int i = 0; i < alt_count; i++) {
     obj = cache_vector->get(i);
     if (obj->compare_object_key(&key)) {
-      // Debug("cache_key", "Resident alternate key  %X", key.word(0));
+      // Debug("cache_key", "Resident alternate key  %X", key.slice32(0));
       return i;
     }
   }
@@ -126,7 +126,7 @@ CacheVC::updateVector(int /* event ATS_UNUSED */, Event */* 
e ATS_UNUSED */)
         f.rewrite_resident_alt = 1;
         write_len = doc->data_len();
         Debug("cache_update_alt",
-              "rewriting resident alt size: %d key: %X, first_key: %X", 
write_len, doc->key.word(0), first_key.word(0));
+              "rewriting resident alt size: %d key: %X, first_key: %X", 
write_len, doc->key.slice32(0), first_key.slice32(0));
       }
     }
     header_len = write_vector->marshal_length();
@@ -260,7 +260,7 @@ Vol::force_evacuate_head(Dir *evac_dir, int pinned)
   }
   b->f.pinned = pinned;
   b->f.evacuate_head = 1;
-  b->evac_frags.key.set(0, 0);  // ensure that the block gets
+  b->evac_frags.key = zero_key;  // ensure that the block gets
   // evacuated no matter what
   b->readers = 0;             // ensure that the block does not disappear
   return b;
@@ -319,7 +319,7 @@ Vol::aggWriteDone(int event, Event *e)
     header->write_pos += io.aiocb.aio_nbytes;
     ink_assert(header->write_pos >= start);
     DDebug("cache_agg", "Dir %s, Write: %" PRIu64 ", last Write: %" PRIu64 
"\n",
-          hash_id, header->write_pos, header->last_write_pos);
+          hash_text, header->write_pos, header->last_write_pos);
     ink_assert(header->write_pos == header->agg_pos);
     if (header->write_pos + EVACUATION_SIZE > scan_pos)
       periodic_scan();
@@ -330,7 +330,7 @@ Vol::aggWriteDone(int event, Event *e)
     // for fragments is this aggregation buffer
     Debug("cache_disk_error", "Write error on disk %s\n \
               write range : [%" PRIu64 " - %" PRIu64 " bytes]  [%" PRIu64 " - 
%" PRIu64 " blocks] \n",
-          hash_id, (uint64_t)io.aiocb.aio_offset,
+          hash_text, (uint64_t)io.aiocb.aio_offset,
           (uint64_t)io.aiocb.aio_offset + io.aiocb.aio_nbytes,
           (uint64_t)io.aiocb.aio_offset / CACHE_BLOCK_SIZE,
           (uint64_t)(io.aiocb.aio_offset + io.aiocb.aio_nbytes) / 
CACHE_BLOCK_SIZE);
@@ -412,7 +412,7 @@ CacheVC::evacuateReadHead(int /* event ATS_UNUSED */, Event 
* /* e ATS_UNUSED */
     alternate_tmp = vector.get(alternate_index);
     doc_len = alternate_tmp->object_size_get();
     Debug("cache_evac", "evacuateReadHead http earliest %X first: %X len: %" 
PRId64,
-          first_key.word(0), earliest_key.word(0), doc_len);
+          first_key.slice32(0), earliest_key.slice32(0), doc_len);
   } else
 #endif
   {
@@ -423,7 +423,7 @@ CacheVC::evacuateReadHead(int /* event ATS_UNUSED */, Event 
* /* e ATS_UNUSED */
       goto Ldone;
     doc_len = doc->total_len;
     DDebug("cache_evac",
-          "evacuateReadHead non-http earliest %X first: %X len: %" PRId64, 
first_key.word(0), earliest_key.word(0), doc_len);
+          "evacuateReadHead non-http earliest %X first: %X len: %" PRId64, 
first_key.slice32(0), earliest_key.slice32(0), doc_len);
   }
   if (doc_len == total_len) {
     // the whole document has been evacuated. Insert the directory
@@ -450,7 +450,7 @@ CacheVC::evacuateDocDone(int /* event ATS_UNUSED */, Event 
*/* e ATS_UNUSED */)
   ink_assert(vol->mutex->thread_holding == this_ethread());
   Doc *doc = (Doc *) buf->data();
   DDebug("cache_evac", "evacuateDocDone %X o %d p %d new_o %d new_p %d",
-        (int) key.word(0), (int) dir_offset(&overwrite_dir),
+        (int) key.slice32(0), (int) dir_offset(&overwrite_dir),
         (int) dir_phase(&overwrite_dir), (int) dir_offset(&dir), (int) 
dir_phase(&dir));
   int i = dir_evac_bucket(&overwrite_dir);
   // nasty beeping race condition, need to have the EvacuationBlock here
@@ -474,7 +474,7 @@ CacheVC::evacuateDocDone(int /* event ATS_UNUSED */, Event 
*/* e ATS_UNUSED */)
           break;
         if (evac->earliest_key.fold()) {
           DDebug("cache_evac", "evacdocdone: evacuating key %X earliest %X",
-                evac->key.word(0), evac->earliest_key.word(0));
+                evac->key.slice32(0), evac->earliest_key.slice32(0));
           EvacuationBlock *eblock = 0;
           Dir dir_tmp;
           dir_lookaside_probe(&evac->earliest_key, vol, &dir_tmp, &eblock);
@@ -497,16 +497,16 @@ CacheVC::evacuateDocDone(int /* event ATS_UNUSED */, 
Event */* e ATS_UNUSED */)
       if (dir_head(&overwrite_dir) && b->f.evacuate_head) {
         DDebug("cache_evac",
               "evacuateDocDone evacuate_head %X %X hlen %d offset %d",
-              (int) key.word(0), (int) doc->key.word(0), doc->hlen, (int) 
dir_offset(&overwrite_dir));
+              (int) key.slice32(0), (int) doc->key.slice32(0), doc->hlen, 
(int) dir_offset(&overwrite_dir));
 
         if (dir_compare_tag(&overwrite_dir, &doc->first_key)) {
           OpenDirEntry *cod;
           DDebug("cache_evac", "evacuating vector: %X %d",
-                (int) doc->first_key.word(0), (int) 
dir_offset(&overwrite_dir));
+                (int) doc->first_key.slice32(0), (int) 
dir_offset(&overwrite_dir));
           if ((cod = vol->open_read(&doc->first_key))) {
             // writer  exists
             DDebug("cache_evac", "overwriting the open directory %X %d %d",
-                  (int) doc->first_key.word(0), (int) 
dir_offset(&cod->first_dir), (int) dir_offset(&dir));
+                  (int) doc->first_key.slice32(0), (int) 
dir_offset(&cod->first_dir), (int) dir_offset(&dir));
             cod->first_dir = dir;
 
           }
@@ -515,7 +515,7 @@ CacheVC::evacuateDocDone(int /* event ATS_UNUSED */, Event 
*/* e ATS_UNUSED */)
             vol->ram_cache->fixup(&doc->first_key, (uint32_t)(o >> 32), 
(uint32_t)o, (uint32_t)(n >> 32), (uint32_t)n);
           }
         } else {
-          DDebug("cache_evac", "evacuating earliest: %X %d", (int) 
doc->key.word(0), (int) dir_offset(&overwrite_dir));
+          DDebug("cache_evac", "evacuating earliest: %X %d", (int) 
doc->key.slice32(0), (int) dir_offset(&overwrite_dir));
           ink_assert(dir_compare_tag(&overwrite_dir, &doc->key));
           ink_assert(b->earliest_evacuator == this);
           total_len += doc->data_len();
@@ -573,7 +573,7 @@ evacuate_fragments(CacheKey *key, CacheKey *earliest_key, 
int force, Vol *vol)
       b->readers = 0;
     DDebug("cache_evac",
           "next fragment %X Earliest: %X offset %d phase %d force %d",
-          (int) key->word(0), (int) earliest_key->word(0), (int) 
dir_offset(&dir), (int) dir_phase(&dir), force);
+          (int) key->slice32(0), (int) earliest_key->slice32(0), (int) 
dir_offset(&dir), (int) dir_phase(&dir), force);
   }
   return i;
 }
@@ -614,7 +614,7 @@ Vol::evacuateDocReadDone(int event, Event *e)
     goto Ldone;
   }
   DDebug("cache_evac", "evacuateDocReadDone %X offset %d",
-        (int) doc->key.word(0), (int) 
dir_offset(&doc_evacuator->overwrite_dir));
+        (int) doc->key.slice32(0), (int) 
dir_offset(&doc_evacuator->overwrite_dir));
 
   b = evacuate[dir_evac_bucket(&doc_evacuator->overwrite_dir)].head;
   while (b) {
@@ -635,7 +635,7 @@ Vol::evacuateDocReadDone(int event, Event *e)
       doc_evacuator->key = doc->first_key;
       b->evac_frags.key = doc->first_key;
       DDebug("cache_evac", "evacuating vector %X offset %d",
-            (int) doc->first_key.word(0), (int) 
dir_offset(&doc_evacuator->overwrite_dir));
+            (int) doc->first_key.slice32(0), (int) 
dir_offset(&doc_evacuator->overwrite_dir));
       b->f.unused = 57;
     } else {
       // if its an earliest fragment (alternate) evacuation, things get
@@ -648,7 +648,7 @@ Vol::evacuateDocReadDone(int event, Event *e)
       b->evac_frags.earliest_key = doc->key;
       b->earliest_evacuator = doc_evacuator;
       DDebug("cache_evac", "evacuating earliest %X %X evac: %p offset: %d",
-            (int) b->evac_frags.key.word(0), (int) doc->key.word(0),
+            (int) b->evac_frags.key.slice32(0), (int) doc->key.slice32(0),
             doc_evacuator, (int) dir_offset(&doc_evacuator->overwrite_dir));
       b->f.unused = 67;
     }
@@ -663,7 +663,7 @@ Vol::evacuateDocReadDone(int event, Event *e)
     doc_evacuator->key = ek->key;
     doc_evacuator->earliest_key = ek->earliest_key;
     DDebug("cache_evac", "evacuateDocReadDone key: %X earliest: %X",
-          (int) ek->key.word(0), (int) ek->earliest_key.word(0));
+          (int) ek->key.slice32(0), (int) ek->earliest_key.slice32(0));
     b->f.unused = 87;
   }
   // if the tag in the c->dir does match the first_key in the
@@ -891,7 +891,7 @@ Vol::evacuate_cleanup_blocks(int i)
          (header->phase == dir_phase(&b->dir) && header->write_pos <= 
vol_offset(this, &b->dir)))) {
       EvacuationBlock *x = b;
       DDebug("cache_evac", "evacuate cleanup free %X offset %d",
-            (int) b->evac_frags.key.word(0), (int) dir_offset(&b->dir));
+            (int) b->evac_frags.key.slice32(0), (int) dir_offset(&b->dir));
       b = b->link.next;
       evacuate[i].remove(x);
       free_EvacuationBlock(x, mutex->thread_holding);
@@ -977,7 +977,7 @@ Lagain:
         header->write_pos + agg_buf_pos + writelen > (skip + len))
       break;
     DDebug("agg_read", "copying: %d, %" PRIu64 ", key: %d",
-          agg_buf_pos, header->write_pos + agg_buf_pos, c->first_key.word(0));
+          agg_buf_pos, header->write_pos + agg_buf_pos, 
c->first_key.slice32(0));
     int wrotelen = agg_copy(agg_buffer + agg_buf_pos, c);
     ink_assert(writelen == wrotelen);
     agg_todo_size -= writelen;
@@ -1096,14 +1096,14 @@ CacheVC::openWriteCloseDir(int /* event ATS_UNUSED */, 
Event */* e ATS_UNUSED */
     if (f.update && closed > 0) {
       if (!total_len && alternate_index != CACHE_ALT_REMOVED) {
         Debug("cache_update", "header only %d (%" PRIu64 ", %" PRIu64 ")\n",
-              DIR_MASK_TAG(first_key.word(2)), update_key.b[0], 
update_key.b[1]);
+              DIR_MASK_TAG(first_key.slice32(2)), update_key.b[0], 
update_key.b[1]);
 
       } else if (total_len && alternate_index != CACHE_ALT_REMOVED) {
         Debug("cache_update", "header body, %d, (%" PRIu64 ", %" PRIu64 "), 
(%" PRIu64 ", %" PRIu64 ")\n",
-              DIR_MASK_TAG(first_key.word(2)), update_key.b[0], 
update_key.b[1], earliest_key.b[0], earliest_key.b[1]);
+              DIR_MASK_TAG(first_key.slice32(2)), update_key.b[0], 
update_key.b[1], earliest_key.b[0], earliest_key.b[1]);
       } else if (!total_len && alternate_index == CACHE_ALT_REMOVED) {
         Debug("cache_update", "alt delete, %d, (%" PRIu64 ", %" PRIu64 ")\n",
-              DIR_MASK_TAG(first_key.word(2)), update_key.b[0], 
update_key.b[1]);
+              DIR_MASK_TAG(first_key.slice32(2)), update_key.b[0], 
update_key.b[1]);
       }
     }
   }
@@ -1169,7 +1169,7 @@ CacheVC::openWriteCloseHeadDone(int event, Event *e)
           od->single_doc_key = earliest_key;
         }
         dir_assign(&od->single_doc_dir, &dir);
-        dir_set_tag(&od->single_doc_dir, od->single_doc_key.word(2));
+        dir_set_tag(&od->single_doc_dir, od->single_doc_key.slice32(2));
       }
     }
   }
@@ -1331,7 +1331,7 @@ CacheVC::openWriteWriteDone(int event, Event *e)
     ++fragment;
     write_pos += write_len;
     dir_insert(&key, vol, &dir);
-    DDebug("cache_insert", "WriteDone: %X, %X, %d", key.word(0), 
first_key.word(0), write_len);
+    DDebug("cache_insert", "WriteDone: %X, %X, %d", key.slice32(0), 
first_key.slice32(0), write_len);
     blocks = iobufferblock_skip(blocks, &offset, &length, write_len);
     next_CacheKey(&key, &key);
   }
@@ -1533,7 +1533,7 @@ Lagain:
         od->move_resident_alt = 1;
         od->single_doc_key = doc->key;
         dir_assign(&od->single_doc_dir, &dir);
-        dir_set_tag(&od->single_doc_dir, od->single_doc_key.word(2));
+        dir_set_tag(&od->single_doc_dir, od->single_doc_key.slice32(2));
       }
       first_buf = buf;
       goto Lsuccess;
@@ -1644,7 +1644,7 @@ Cache::open_write(Continuation *cont, CacheKey *key, 
CacheFragType frag_type,
    */
   do {
     rand_CacheKey(&c->key, cont->mutex);
-  } while (DIR_MASK_TAG(c->key.word(2)) == DIR_MASK_TAG(c->first_key.word(2)));
+  } while (DIR_MASK_TAG(c->key.slice32(2)) == 
DIR_MASK_TAG(c->first_key.slice32(2)));
   c->earliest_key = c->key;
 #ifdef HTTP_CACHE
   c->info = 0;
@@ -1707,7 +1707,7 @@ Cache::open_write(Continuation *cont, CacheKey *key, 
CacheHTTPInfo *info, time_t
   do {
     rand_CacheKey(&c->key, cont->mutex);
   }
-  while (DIR_MASK_TAG(c->key.word(2)) == DIR_MASK_TAG(c->first_key.word(2)));
+  while (DIR_MASK_TAG(c->key.slice32(2)) == 
DIR_MASK_TAG(c->first_key.slice32(2)));
   c->earliest_key = c->key;
   c->frag_type = CACHE_FRAG_TYPE_HTTP;
   c->vol = key_to_vol(key, hostname, host_len);
@@ -1859,7 +1859,7 @@ Lagain:
       else
         dir_insert(&mts->key, vol, &mts->dir);
       DDebug("cache_insert", "InterimCache: WriteDone: key: %X, first_key: %X, 
write_len: %d, write_offset: %" PRId64 ", dir_last_word: %X",
-          doc->key.word(0), doc->first_key.word(0), mts->agg_len, o, 
mts->dir.w[4]);
+          doc->key.slice32(0), doc->first_key.slice32(0), mts->agg_len, o, 
mts->dir.w[4]);
 
       if (mts->copy) {
         mts->interim_vol->vol->ram_cache->fixup(&mts->key, (uint32_t)(old_off 
>> 32), (uint32_t)old_off,

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/P_CacheDir.h
----------------------------------------------------------------------
diff --git a/iocore/cache/P_CacheDir.h b/iocore/cache/P_CacheDir.h
index 013698a..638051c 100644
--- a/iocore/cache/P_CacheDir.h
+++ b/iocore/cache/P_CacheDir.h
@@ -289,7 +289,7 @@ struct OpenDir: public Continuation
 
   int open_write(CacheVC *c, int allow_if_writers, int max_writers);
   int close_write(CacheVC *c);
-  OpenDirEntry *open_read(INK_MD5 *key);
+  OpenDirEntry *open_read(CryptoHash *key);
   int signal_readers(int event, Event *e);
 
   OpenDir();
@@ -347,7 +347,7 @@ extern Dir empty_dir;
 TS_INLINE bool
 dir_compare_tag(Dir *e, CacheKey *key)
 {
-  return (dir_tag(e) == DIR_MASK_TAG(key->word(2)));
+  return (dir_tag(e) == DIR_MASK_TAG(key->slice32(2)));
 }
 
 TS_INLINE Dir *

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/P_CacheHosting.h
----------------------------------------------------------------------
diff --git a/iocore/cache/P_CacheHosting.h b/iocore/cache/P_CacheHosting.h
index 5d1e793..ce376cc 100644
--- a/iocore/cache/P_CacheHosting.h
+++ b/iocore/cache/P_CacheHosting.h
@@ -80,7 +80,7 @@ public:
   CacheHostMatcher(const char * name, CacheType typ);
   ~CacheHostMatcher();
 
-  void Match(char *rdata, int rlen, CacheHostResult *result);
+  void Match(char const* rdata, int rlen, CacheHostResult *result);
   void AllocateSpace(int num_entries);
   void NewEntry(matcher_line *line_info);
   void Print();
@@ -107,7 +107,7 @@ public:
    ~CacheHostTable();
   int BuildTable(const char * config_file_path);
   int BuildTableFromString(const char * config_file_path, char *str);
-  void Match(char *rdata, int rlen, CacheHostResult *result);
+  void Match(char const* rdata, int rlen, CacheHostResult *result);
   void Print();
 
   int getEntryCount() const { return m_numEntries; }

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/P_CacheInternal.h
----------------------------------------------------------------------
diff --git a/iocore/cache/P_CacheInternal.h b/iocore/cache/P_CacheInternal.h
index 3b8987e..5afac60 100644
--- a/iocore/cache/P_CacheInternal.h
+++ b/iocore/cache/P_CacheInternal.h
@@ -1020,7 +1020,7 @@ struct Cache
   int open(bool reconfigure, bool fix);
   int close();
 
-  Action *lookup(Continuation *cont, CacheKey *key, CacheFragType type, char 
*hostname, int host_len);
+  Action *lookup(Continuation *cont, CacheKey *key, CacheFragType type, char 
const* hostname, int host_len);
   inkcoreapi Action *open_read(Continuation *cont, CacheKey *key, 
CacheFragType type, char *hostname, int len);
   inkcoreapi Action *open_write(Continuation *cont, CacheKey *key,
                                 CacheFragType frag_type, int options = 0,
@@ -1055,7 +1055,7 @@ struct Cache
 
   int open_done();
 
-  Vol *key_to_vol(CacheKey *key, char *hostname, int host_len);
+  Vol *key_to_vol(CacheKey *key, char const* hostname, int host_len);
 
   Cache()
     : cache_read_done(0), total_good_nvol(0), total_nvol(0), 
ready(CACHE_INITIALIZING), cache_size(0),  // in store block size
@@ -1074,7 +1074,7 @@ Cache::open_read(Continuation *cont, CacheURL *url, 
CacheHTTPHdr *request,
 {
   INK_MD5 md5;
   int len;
-  url->MD5_get(&md5);
+  url->hash_get(&md5);
   const char *hostname = url->host_get(&len);
   return open_read(cont, &md5, request, params, type, (char *) hostname, len);
 }
@@ -1082,7 +1082,7 @@ Cache::open_read(Continuation *cont, CacheURL *url, 
CacheHTTPHdr *request,
 TS_INLINE void
 Cache::generate_key(INK_MD5 *md5, URL *url)
 {
-  url->MD5_get(md5);
+  url->hash_get(md5);
 }
 
 TS_INLINE Action *
@@ -1091,7 +1091,7 @@ Cache::open_write(Continuation *cont, CacheURL *url, 
CacheHTTPHdr *request,
 {
   (void) request;
   INK_MD5 url_md5;
-  url->MD5_get(&url_md5);
+  url->hash_get(&url_md5);
   int len;
   const char *hostname = url->host_get(&len);
 
@@ -1229,7 +1229,7 @@ CacheProcessor::lookup(Continuation *cont, URL *url, bool 
cluster_cache_local, b
 {
   (void) local_only;
   INK_MD5 md5;
-  url->MD5_get(&md5);
+  url->hash_get(&md5);
   int host_len = 0;
   const char *hostname = url->host_get(&host_len);
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/P_CacheVol.h
----------------------------------------------------------------------
diff --git a/iocore/cache/P_CacheVol.h b/iocore/cache/P_CacheVol.h
index ecf2d41..7c8ea0e 100644
--- a/iocore/cache/P_CacheVol.h
+++ b/iocore/cache/P_CacheVol.h
@@ -124,8 +124,8 @@ struct VolHeaderFooter
 struct EvacuationKey
 {
   SLink<EvacuationKey> link;
-  INK_MD5 key;
-  INK_MD5 earliest_key;
+  CryptoHash key;
+  CryptoHash earliest_key;
 };
 
 struct EvacuationBlock
@@ -236,9 +236,9 @@ struct AccessHistory {
     return tail;
   }
 
-  void set_in_progress(INK_MD5 *key) {
-    uint32_t key_index = key->word(3);
-    uint16_t tag = (uint16_t) key->word(1);
+  void set_in_progress(CryptoHash *key) {
+    uint32_t key_index = key->slice32(3);
+    uint16_t tag = static_cast<uint16_t>(key->slice32(1));
     unsigned int hash_index = (uint32_t) (key_index % hash_size);
 
     uint32_t index = hash[hash_index];
@@ -248,9 +248,9 @@ struct AccessHistory {
     }
   }
 
-  void set_not_in_progress(INK_MD5 *key) {
-    uint32_t key_index = key->word(3);
-    uint16_t tag = (uint16_t) key->word(1);
+  void set_not_in_progress(CryptoHash *key) {
+    uint32_t key_index = key->slice32(3);
+    uint16_t tag = static_cast<uint16_t>(key->slice32(1));
     unsigned int hash_index = (uint32_t) (key_index % hash_size);
 
     uint32_t index = hash[hash_index];
@@ -260,9 +260,9 @@ struct AccessHistory {
     }
   }
 
-  void put_key(INK_MD5 *key) {
-    uint32_t key_index = key->word(3);
-    uint16_t tag = (uint16_t) key->word(1);
+  void put_key(CryptoHash *key) {
+    uint32_t key_index = key->slice32(3);
+    uint16_t tag = static_cast<uint16_t>(key->slice32(1));
     unsigned int hash_index = (uint32_t) (key_index % hash_size);
 
     uint32_t index = hash[hash_index];
@@ -292,11 +292,11 @@ struct AccessHistory {
     }
   }
 
-  bool remove_key(INK_MD5 *key) {
-    unsigned int hash_index = (uint32_t) (key->word(3) % hash_size);
+  bool remove_key(CryptoHash *key) {
+    unsigned int hash_index = static_cast<uint32_t>(key->slice32(3) % 
hash_size);
     uint32_t index = hash[hash_index];
     AccessEntry *entry = &base[index];
-    if (index != 0 && entry->item.tag == (uint16_t)key->word(1) && 
entry->item.index == key->word(3)) {
+    if (index != 0 && entry->item.tag == 
static_cast<uint16_t>(key->slice32(1)) && entry->item.index == key->slice32(3)) 
{
       remove(entry);
       freeEntry(entry);
       return true;
@@ -304,9 +304,9 @@ struct AccessHistory {
     return false;
   }
 
-  bool is_hot(INK_MD5 *key) {
-    uint32_t key_index = key->word(3);
-    uint16_t tag = (uint16_t) key->word(1);
+  bool is_hot(CryptoHash *key) {
+    uint32_t key_index = key->slice32(3);
+    uint16_t tag = (uint16_t) key->slice32(1);
     unsigned int hash_index = (uint32_t) (key_index % hash_size);
 
     uint32_t index = hash[hash_index];
@@ -414,8 +414,8 @@ void dir_clean_interimvol(InterimCacheVol *d);
 struct Vol: public Continuation
 {
   char *path;
-  char *hash_id;
-  INK_MD5 hash_id_md5;
+  char *hash_text;
+  CryptoHash hash_id;
   int fd;
 
   char *raw_dir;
@@ -477,7 +477,7 @@ struct Vol: public Continuation
 
 
   bool migrate_probe(CacheKey *key, MigrateToInterimCache **result) {
-    uint32_t indx = key->word(3) % MIGRATE_BUCKETS;
+    uint32_t indx = key->slice32(3) % MIGRATE_BUCKETS;
     MigrateToInterimCache *m = mig_hash[indx].head;
     while (m != NULL && !(m->key == *key)) {
       m = mig_hash[indx].next(m);
@@ -516,8 +516,8 @@ struct Vol: public Continuation
   int begin_read_lock(CacheVC *cont);
   // unused read-write interlock code
   // currently http handles a write-lock failure by retrying the read
-  OpenDirEntry *open_read(INK_MD5 *key);
-  OpenDirEntry *open_read_lock(INK_MD5 *key, EThread *t);
+  OpenDirEntry *open_read(CryptoHash *key);
+  OpenDirEntry *open_read_lock(CryptoHash *key, EThread *t);
   int close_read(CacheVC *cont);
   int close_read_lock(CacheVC *cont);
 
@@ -625,8 +625,8 @@ struct Doc
   uint32_t magic;         // DOC_MAGIC
   uint32_t len;           // length of this segment (including hlen, flen & 
sizeof(Doc), unrounded)
   uint64_t total_len;     // total length of document
-  INK_MD5 first_key;    // first key in document (http: vector)
-  INK_MD5 key;
+  CryptoHash first_key;    // first key in document (http: vector)
+  CryptoHash key;
   uint32_t hlen;          // header length
   uint32_t ftype:8;       // fragment type CACHE_FRAG_TYPE_XX
   uint32_t _flen:24;       // fragment table length [amc] NOT USED
@@ -849,7 +849,7 @@ free_EvacuationBlock(EvacuationBlock *b, EThread *t)
 }
 
 TS_INLINE OpenDirEntry *
-Vol::open_read(INK_MD5 *key)
+Vol::open_read(CryptoHash *key)
 {
   return open_dir.open_read(key);
 }

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/RamCacheCLFUS.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/RamCacheCLFUS.cc b/iocore/cache/RamCacheCLFUS.cc
index bcdfc98..f7781de 100644
--- a/iocore/cache/RamCacheCLFUS.cc
+++ b/iocore/cache/RamCacheCLFUS.cc
@@ -156,7 +156,7 @@ RamCacheCLFUS::resize_hashtable()
     for (int64_t i = 0; i < nbuckets; i++) {
       RamCacheCLFUSEntry *e = 0;
       while ((e = bucket[i].pop()))
-        new_bucket[e->key.word(3) % anbuckets].push(e);
+        new_bucket[e->key.slice32(3) % anbuckets].push(e);
     }
     ats_free(bucket);
   }
@@ -204,7 +204,7 @@ RamCacheCLFUS::get(INK_MD5 *key, Ptr<IOBufferData> 
*ret_data, uint32_t auxkey1,
 {
   if (!max_bytes)
     return 0;
-  int64_t i = key->word(3) % nbuckets;
+  int64_t i = key->slice32(3) % nbuckets;
   RamCacheCLFUSEntry *e = bucket[i].head;
   char *b = 0;
   while (e) {
@@ -264,25 +264,25 @@ RamCacheCLFUS::get(INK_MD5 *key, Ptr<IOBufferData> 
*ret_data, uint32_t auxkey1,
           (*ret_data) = data;
         }
         CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_hits_stat, 1);
-        DDebug("ram_cache", "get %X %d %d size %d HIT", key->word(3), auxkey1, 
auxkey2, e->size);
+        DDebug("ram_cache", "get %X %d %d size %d HIT", key->slice32(3), 
auxkey1, auxkey2, e->size);
         return 1;
       } else {
         CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_misses_stat, 1);
-        DDebug("ram_cache", "get %X %d %d HISTORY", key->word(3), auxkey1, 
auxkey2);
+        DDebug("ram_cache", "get %X %d %d HISTORY", key->slice32(3), auxkey1, 
auxkey2);
         return 0;
       }
     }
     assert(e != e->hash_link.next);
     e = e->hash_link.next;
   }
-  DDebug("ram_cache", "get %X %d %d MISS", key->word(3), auxkey1, auxkey2);
+  DDebug("ram_cache", "get %X %d %d MISS", key->slice32(3), auxkey1, auxkey2);
 Lerror:
   CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_misses_stat, 1);
   return 0;
 Lfailed:
   ats_free(b);
   destroy(e);
-  DDebug("ram_cache", "get %X %d %d Z_ERR", key->word(3), auxkey1, auxkey2);
+  DDebug("ram_cache", "get %X %d %d Z_ERR", key->slice32(3), auxkey1, auxkey2);
   goto Lerror;
 }
 
@@ -302,9 +302,9 @@ void RamCacheCLFUS::tick() {
 Lfree:
   e->flag_bits.lru = 0;
   history--;
-  uint32_t b = e->key.word(3) % nbuckets;
+  uint32_t b = e->key.slice32(3) % nbuckets;
   bucket[b].remove(e);
-  DDebug("ram_cache", "put %X %d %d size %d FREED", e->key.word(3), 
e->auxkey1, e->auxkey2, e->size);
+  DDebug("ram_cache", "put %X %d %d size %d FREED", e->key.slice32(3), 
e->auxkey1, e->auxkey2, e->size);
   THREAD_FREE(e, ramCacheCLFUSEntryAllocator, this_thread());
 }
 
@@ -312,7 +312,7 @@ void
 RamCacheCLFUS::victimize(RamCacheCLFUSEntry *e)
 {
   objects--;
-  DDebug("ram_cache", "put %X %d %d size %d VICTIMIZED", e->key.word(3), 
e->auxkey1, e->auxkey2, e->size);
+  DDebug("ram_cache", "put %X %d %d size %d VICTIMIZED", e->key.slice32(3), 
e->auxkey1, e->auxkey2, e->size);
   e->data = NULL;
   e->flag_bits.lru = 1;
   lru[1].enqueue(e);
@@ -345,9 +345,9 @@ RamCacheCLFUS::destroy(RamCacheCLFUSEntry *e)
     e->data = NULL;
   } else
     history--;
-  uint32_t b = e->key.word(3) % nbuckets;
+  uint32_t b = e->key.slice32(3) % nbuckets;
   bucket[b].remove(e);
-  DDebug("ram_cache", "put %X %d %d DESTROYED", e->key.word(3), e->auxkey1, 
e->auxkey2);
+  DDebug("ram_cache", "put %X %d %d DESTROYED", e->key.slice32(3), e->auxkey1, 
e->auxkey2);
   THREAD_FREE(e, ramCacheCLFUSEntryAllocator, this_thread());
   return ret;
 }
@@ -424,7 +424,7 @@ RamCacheCLFUS::compress_entries(EThread *thread, int 
do_at_most)
       MUTEX_TAKE_LOCK(vol->mutex, thread);
       // see if the entry is till around
       {
-        uint32_t i = key.word(3) % nbuckets;
+        uint32_t i = key.slice32(3) % nbuckets;
         RamCacheCLFUSEntry *ee = bucket[i].head;
         while (ee) {
           if (ee->key == key && ee->data == edata) break;
@@ -472,7 +472,7 @@ RamCacheCLFUS::compress_entries(EThread *thread, int 
do_at_most)
     e->flag_bits.incompressible = 1;
   Lcontinue:;
     DDebug("ram_cache", "compress %X %d %d %d %d %d %d %d",
-           e->key.word(3), e->auxkey1, e->auxkey2,
+           e->key.slice32(3), e->auxkey1, e->auxkey2,
            e->flag_bits.incompressible, e->flag_bits.compressed,
            e->len, e->compressed_len, ncompressed);
     if (!e->lru_link.next)
@@ -501,7 +501,7 @@ RamCacheCLFUS::put(INK_MD5 *key, IOBufferData *data, 
uint32_t len, bool copy, ui
 {
   if (!max_bytes)
     return 0;
-  uint32_t i = key->word(3) % nbuckets;
+  uint32_t i = key->slice32(3) % nbuckets;
   RamCacheCLFUSEntry *e = bucket[i].head;
   uint32_t size = copy ? len : data->block_size();
   while (e) {
@@ -537,7 +537,7 @@ RamCacheCLFUS::put(INK_MD5 *key, IOBufferData *data, 
uint32_t len, bool copy, ui
       check_accounting(this);
       e->flag_bits.copy = copy;
       e->flag_bits.compressed = 0;
-      DDebug("ram_cache", "put %X %d %d size %d HIT", key->word(3), auxkey1, 
auxkey2, e->size);
+      DDebug("ram_cache", "put %X %d %d size %d HIT", key->slice32(3), 
auxkey1, auxkey2, e->size);
       return 1;
     } else
       lru[1].remove(e);
@@ -548,12 +548,12 @@ RamCacheCLFUS::put(INK_MD5 *key, IOBufferData *data, 
uint32_t len, bool copy, ui
     if (bytes + size <= max_bytes)
       goto Linsert;
   if (!e && cache_config_ram_cache_use_seen_filter) {
-    uint32_t s = key->word(3) % bucket_sizes[ibuckets];
-    uint16_t k = key->word(3) >> 16;
+    uint32_t s = key->slice32(3) % bucket_sizes[ibuckets];
+    uint16_t k = key->slice32(3) >> 16;
     uint16_t kk = seen[s];
     seen[s] = k;
     if (history >= objects && kk != k) {
-      DDebug("ram_cache", "put %X %d %d size %d UNSEEN", key->word(3), 
auxkey1, auxkey2, size);
+      DDebug("ram_cache", "put %X %d %d size %d UNSEEN", key->slice32(3), 
auxkey1, auxkey2, size);
       return 0;
     }
   }
@@ -565,7 +565,7 @@ RamCacheCLFUS::put(INK_MD5 *key, IOBufferData *data, 
uint32_t len, bool copy, ui
       if (e)
         lru[1].enqueue(e);
       requeue_victims(this, victims);
-      DDebug("ram_cache", "put %X %d %d NO VICTIM", key->word(3), auxkey1, 
auxkey2);
+      DDebug("ram_cache", "put %X %d %d NO VICTIM", key->slice32(3), auxkey1, 
auxkey2);
       return 0;
     }
     bytes -= victim->size + ENTRY_OVERHEAD;
@@ -585,7 +585,7 @@ RamCacheCLFUS::put(INK_MD5 *key, IOBufferData *data, 
uint32_t len, bool copy, ui
         requeue_victims(this, victims);
         lru[1].enqueue(e);
         DDebug("ram_cache", "put %X %d %d size %d INC %" PRId64" HISTORY",
-               key->word(3), auxkey1, auxkey2, e->size, e->hits);
+               key->slice32(3), auxkey1, auxkey2, e->size, e->hits);
         return 0;
       }
     }
@@ -634,7 +634,7 @@ Linsert:
   lru[0].enqueue(e);
   e->len = len;
   check_accounting(this);
-  DDebug("ram_cache", "put %X %d %d size %d INSERTED", key->word(3), auxkey1, 
auxkey2, e->size);
+  DDebug("ram_cache", "put %X %d %d size %d INSERTED", key->slice32(3), 
auxkey1, auxkey2, e->size);
   return 1;
 Lhistory:
   requeue_victims(this, victims);
@@ -650,7 +650,7 @@ Lhistory:
   e->flag_bits.lru = 1;
   lru[1].enqueue(e);
   history++;
-  DDebug("ram_cache", "put %X %d %d HISTORY", key->word(3), auxkey1, auxkey2);
+  DDebug("ram_cache", "put %X %d %d HISTORY", key->slice32(3), auxkey1, 
auxkey2);
   return 0;
 }
 
@@ -660,7 +660,7 @@ RamCacheCLFUS::fixup(INK_MD5 * key, uint32_t old_auxkey1, 
uint32_t old_auxkey2,
 {
   if (!max_bytes)
     return 0;
-  uint32_t i = key->word(3) % nbuckets;
+  uint32_t i = key->slice32(3) % nbuckets;
   RamCacheCLFUSEntry *e = bucket[i].head;
   while (e) {
     if (e->key == *key && e->auxkey1 == old_auxkey1 && e->auxkey2 == 
old_auxkey2) {

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/cache/RamCacheLRU.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/RamCacheLRU.cc b/iocore/cache/RamCacheLRU.cc
index ddf7620..c85df38 100644
--- a/iocore/cache/RamCacheLRU.cc
+++ b/iocore/cache/RamCacheLRU.cc
@@ -76,7 +76,7 @@ void RamCacheLRU::resize_hashtable() {
     for (int64_t i = 0; i < nbuckets; i++) {
       RamCacheLRUEntry *e = 0;
       while ((e = bucket[i].pop()))
-        new_bucket[e->key.word(3) % anbuckets].push(e);
+        new_bucket[e->key.slice32(3) % anbuckets].push(e);
     }
     ats_free(bucket);
   }
@@ -104,32 +104,32 @@ int
 RamCacheLRU::get(INK_MD5 * key, Ptr<IOBufferData> *ret_data, uint32_t auxkey1, 
uint32_t auxkey2) {
   if (!max_bytes)
     return 0;
-  uint32_t i = key->word(3) % nbuckets;
+  uint32_t i = key->slice32(3) % nbuckets;
   RamCacheLRUEntry *e = bucket[i].head;
   while (e) {
     if (e->key == *key && e->auxkey1 == auxkey1 && e->auxkey2 == auxkey2) {
       lru.remove(e);
       lru.enqueue(e);
       (*ret_data) = e->data;
-      DDebug("ram_cache", "get %X %d %d HIT", key->word(3), auxkey1, auxkey2);
+      DDebug("ram_cache", "get %X %d %d HIT", key->slice32(3), auxkey1, 
auxkey2);
       CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_hits_stat, 1);
       return 1;
     }
     e = e->hash_link.next;
   }
-  DDebug("ram_cache", "get %X %d %d MISS", key->word(3), auxkey1, auxkey2);
+  DDebug("ram_cache", "get %X %d %d MISS", key->slice32(3), auxkey1, auxkey2);
   CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_misses_stat, 1);
   return 0;
 }
 
 RamCacheLRUEntry * RamCacheLRU::remove(RamCacheLRUEntry *e) {
   RamCacheLRUEntry *ret = e->hash_link.next;
-  uint32_t b = e->key.word(3) % nbuckets;
+  uint32_t b = e->key.slice32(3) % nbuckets;
   bucket[b].remove(e);
   lru.remove(e);
   bytes -= e->data->block_size();
   CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_bytes_stat, 
-e->data->block_size());
-  DDebug("ram_cache", "put %X %d %d FREED", e->key.word(3), e->auxkey1, 
e->auxkey2);
+  DDebug("ram_cache", "put %X %d %d FREED", e->key.slice32(3), e->auxkey1, 
e->auxkey2);
   e->data = NULL;
   THREAD_FREE(e, ramCacheLRUEntryAllocator, this_thread());
   objects--;
@@ -140,13 +140,13 @@ RamCacheLRUEntry * RamCacheLRU::remove(RamCacheLRUEntry 
*e) {
 int RamCacheLRU::put(INK_MD5 *key, IOBufferData *data, uint32_t len, bool, 
uint32_t auxkey1, uint32_t auxkey2) {
   if (!max_bytes)
     return 0;
-  uint32_t i = key->word(3) % nbuckets;
+  uint32_t i = key->slice32(3) % nbuckets;
   if (cache_config_ram_cache_use_seen_filter) {
-    uint16_t k = key->word(3) >> 16;
+    uint16_t k = key->slice32(3) >> 16;
     uint16_t kk = seen[i];
     seen[i] = k;
     if ((kk != (uint16_t)k)) {
-      DDebug("ram_cache", "put %X %d %d len %d UNSEEN", key->word(3), auxkey1, 
auxkey2, len);
+      DDebug("ram_cache", "put %X %d %d len %d UNSEEN", key->slice32(3), 
auxkey1, auxkey2, len);
       return 0;
     }
   }
@@ -181,7 +181,7 @@ int RamCacheLRU::put(INK_MD5 *key, IOBufferData *data, 
uint32_t len, bool, uint3
     else
       break;
   }
-  DDebug("ram_cache", "put %X %d %d INSERTED", key->word(3), auxkey1, auxkey2);
+  DDebug("ram_cache", "put %X %d %d INSERTED", key->slice32(3), auxkey1, 
auxkey2);
   if (objects > nbuckets) {
     ++ibuckets;
     resize_hashtable();
@@ -192,7 +192,7 @@ int RamCacheLRU::put(INK_MD5 *key, IOBufferData *data, 
uint32_t len, bool, uint3
 int RamCacheLRU::fixup(INK_MD5 * key, uint32_t old_auxkey1, uint32_t 
old_auxkey2, uint32_t new_auxkey1, uint32_t new_auxkey2) {
   if (!max_bytes)
     return 0;
-  uint32_t i = key->word(3) % nbuckets;
+  uint32_t i = key->slice32(3) % nbuckets;
   RamCacheLRUEntry *e = bucket[i].head;
   while (e) {
     if (e->key == *key && e->auxkey1 == old_auxkey1 && e->auxkey2 == 
old_auxkey2) {

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/iocore/hostdb/HostDB.cc
----------------------------------------------------------------------
diff --git a/iocore/hostdb/HostDB.cc b/iocore/hostdb/HostDB.cc
index 1b082ee..e295f7d 100644
--- a/iocore/hostdb/HostDB.cc
+++ b/iocore/hostdb/HostDB.cc
@@ -175,7 +175,8 @@ HostDBMD5::refresh() {
     memset(buff, 0, 2);
     memcpy(buff+2, ip._addr._byte, n);
     memset(buff + 2 + n , 0, 2);
-    hash.encodeBuffer(buff, n+4);
+    MD5Context().hash_immediate(hash, buff, n+4);
+//    hash.encodeBuffer(buff, n+4);
   }
 }
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2ac12c4a/lib/ts/CryptoHash.h
----------------------------------------------------------------------
diff --git a/lib/ts/CryptoHash.h b/lib/ts/CryptoHash.h
new file mode 100644
index 0000000..9dcec91
--- /dev/null
+++ b/lib/ts/CryptoHash.h
@@ -0,0 +1,124 @@
+# if ! defined CRYPTO_HASH_HEADER
+# define CRYPTO_HASH_HEADER
+
+/** @file
+    Protocol class for crypto hashes.
+
+    @section license License
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ */
+
+/// Apache Traffic Server commons.
+namespace ats {
+  /// Crypto hash output.
+  union CryptoHash {
+    uint64_t b[2];   // Legacy placeholder
+    uint64_t u64[2];
+    uint32_t u32[4];
+    uint8_t  u8[16];
+
+    /// Default constructor - init to zero.
+    CryptoHash() {
+      u64[0] = 0;
+      u64[1] = 0;
+    }
+
+    /// Assignment - bitwise copy.
+    CryptoHash& operator = (CryptoHash const& that) {
+      u64[0] = that.u64[0];
+      u64[1] = that.u64[1];
+      return *this;
+    }
+
+    /// Equality - bitwise identical.
+    bool operator == (CryptoHash const& that) const {
+      return u64[0] == that.u64[0] && u64[1] == that.u64[1];
+    }
+
+    /// Equality - bitwise identical.
+    bool operator != (CryptoHash const& that) const {
+      return !(*this == that);
+    }
+
+    /// Reduce to 64 bit value.
+    uint64_t fold() const {
+      return u64[0] ^ u64[1];
+    }
+
+    /// Access 64 bit slice.
+    uint64_t operator [] (int i) const {
+      return u64[i];
+    }
+
+    /// Access 64 bit slice.
+    /// @note Identical to @ operator[] but included for symmetry.
+    uint64_t slice64(int i) const {
+      return u64[i];
+    }
+
+    /// Access 32 bit slice.
+    uint32_t slice32(int i) const {
+      return u32[i];
+    }
+
+    /// Fast conversion to hex in fixed sized string.
+    char *toHexStr(char buffer[33]) {
+      return ink_code_to_hex_str(buffer, u8);
+    }
+  };
+
+  extern CryptoHash const CRYPTO_HASH_ZERO;
+
+  /** Protocol class for a crypto hash context.
+
+      A hash of this type is used for strong hashing, such as for URLs.
+  */
+  class CryptoContext {
+    typedef CryptoContext self; ///< Self reference type.
+  public:
+
+    /// Destructor (force virtual)
+    virtual ~CryptoContext() { }
+
+    /// Update the hash with @a data of @a length bytes.
+    virtual bool update(void const* data, int length) = 0;
+    /// Finalize and extract the @a hash.
+    virtual bool finalize(CryptoHash& hash) = 0;
+
+    /// Convenience overload.
+    bool finalize(CryptoHash* hash);
+
+    /// Convenience - compute final @a hash for @a data.
+    /// @note This is just as fast as the previous style, as a new context 
must be initialized
+    /// everytime this is done.
+    virtual bool hash_immediate(CryptoHash& hash, void const* data, int 
length);
+  };
+
+  inline bool CryptoContext::hash_immediate(CryptoHash& hash, void const* 
data, int length) {
+    return this->update(data, length) && this->finalize(hash);
+  }
+  inline bool CryptoContext::finalize(CryptoHash* hash) { return 
this->finalize(*hash); }
+
+} // end namespace
+
+// Promote for the primitives who don't use namespaces...
+using ats::CryptoHash;
+using ats::CryptoContext;
+using ats::CRYPTO_HASH_ZERO;
+
+# endif // CRYPTO_HASH_HEADER

Reply via email to