⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testhashcasen.cxx

📁 这是国外的resip协议栈
💻 CXX
字号:
#include <iostream>#include <string>#include <assert.h>// djb2 hash swiped from the net, credited to bernsteinunsigned inthash(const char *str, unsigned int len){   unsigned int hash = 5381;   int c;   int i = 0;   while (c = *str++)   {      if (i == len)      {         break;      }      hash = ((hash << 5) + hash) + c; /* hash * 33 + c */   }   hash = ((hash << 5) + hash) + len;   return hash;}// unrolled and case insensitizedunsigned int hashcasen(const char* data,           unsigned int len){   unsigned int x = 5381;   switch (len)   {      case 1 :         return (x << 5) + x + (0x40 | *data);      case 2 :       {         x = (x << 5) + x + (0x40 | *data);         return (x << 5) + x + (0x40 | *(data+1));      }      case 3 :       {         x = (x << 5) + x + (0x40 | *data);         x = (x << 5) + x + (0x40 | *(data+1));         return (x << 5) + x + (0x40 | *(data+2));      }      default :      {         x = (x << 5) + x + (0x40 | *data);         x = (x << 5) + x + (0x40 | *(data+len-1));         x = (x << 5) + x + (0x40 | *(data+2));         x = (x << 5) + x + (0x40 | *(data+len-2));         return (x << 5) + x + len;      }   }}// strategy:// use sparse parallel arrays of size num_buckets + 1// name => enum// the name is stored by hashcasen(name) % num_buckets// if the position is occupied, move up the array until a free spot is found// on lookup://    if the name array [hash] is empty, return UNKNOWN//    if the name array[hash] is occupied and equal, found, return enum[hash]//    if the name array[hash] is occupied and !equal, try hash++int main(){   std::string parameters[17] =       {         "transport",         "user",         "method",         "ttl",         "maddr",         "lr",         "q",         "purpose",         "expires",         "handling",         "tag",         "duration",         "branch",         "received",         "comp",         "rport"      };   std::string PARAMETERS[17] =       {         "TRANSPORT",         "USER",         "METHOD",         "TTL",         "MADDR",         "LR",         "Q",         "PURPOSE",         "EXPIRES",         "HANDLING",         "TAG",         "DURATION",         "BRANCH",         "RECEIVED",         "COMP",         "RPORT"      };   for (int i = 0; i < 16; i++)   {      std::cerr << parameters[i] << " => " << hashcasen(parameters[i].c_str(), parameters[i].size()) % 73 << std::endl;      assert(hashcasen(parameters[i].c_str(), parameters[i].size()) == hashcasen(parameters[i].c_str(), PARAMETERS[i].size()));   }   std::cerr << std::endl;   std::cerr << std::endl;   std::string headers[] =       {         "Body",         "CSeq",         "Call_ID",         "Contact",         "Content_Length",         "Expires",         "From",         "Max_Forwards",         "Route",         "Subject",         "To",         "Via",         "Accept",         "Accept_Encoding",         "Accept_Language",         "Alert_Info",         "Allow",         "Authentication_Info",         "Authorization",         "Call_Info",         "Content_Disposition",         "Content_Encoding",         "Content_Language",         "Content_Type",         "Date",         "Error_Info",         "In_Reply_To",         "Min_Expires",         "MIME_Version",         "Organization",         "Priority",         "Proxy_Authenticate",         "Proxy_Authorization",         "Proxy_Require",         "Record_Route",         "Reply_To",         "Require",         "Retry_After",         "Server",         "Supported",         "Timestamp",         "Unsupported",         "User_Agent",         "Warning",         "WWW_Authenticate",         "Subscription_State"      };   for (int i = 0; i < 46; i++)   {      std::cerr << headers[i] << " => " << hashcasen(headers[i].c_str(), headers[i].size()) % 505 << std::endl;   }}/* ==================================================================== * The Vovida Software License, Version 1.0  *  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: *  * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. *  * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. *  * 3. The names "VOCAL", "Vovida Open Communication Application Library", *    and "Vovida Open Communication Application Library (VOCAL)" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written *    permission, please contact vocal@vovida.org. * * 4. Products derived from this software may not be called "VOCAL", nor *    may "VOCAL" appear in their name, without prior written *    permission of Vovida Networks, Inc. *  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. *  * ==================================================================== *  * This software consists of voluntary contributions made by Vovida * Networks, Inc. and many individuals on behalf of Vovida Networks, * Inc.  For more information on Vovida Networks, Inc., please see * <http://www.vovida.org/>. * */

⌨️ 快捷键说明

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