C语言数据结构之顺序结构,字符串(String)的计算HASHCODE的方法和其他功能
继续上一个关于String的操作
判断字符串是否以prefix开头/是否以suffix结尾
- 是否以suffix结尾函数 string_ends_with
- 是否以prefix开头函数 string_starts_with
代码如下:
/* if string ends with suffix return 1 else return 0 */
int
string_ends_with (String *st, char *suffix)
{
int tmp = 1;
for (int i = st->length - 1, j = strlen (suffix) - 1; j >= 0; j--, i--)
if (st->elts[i] != suffix[j])
{ tmp = 0; break; }
return tmp;
}
/* if string starts with prefix return 1 else return 0 */
int
string_starts_with (String *st, char *prefix)
{
int tmp = 1;
for (int i = 0, j = 0; j < strlen (prefix); j++, i++)
if (st->elts[i] != prefix[j])
{ tmp = 0; break; }
return tmp;
}
- 测试函数test_string_with代码如下:
/**/
void
test_string_with (void)
{
String *st = string_new ("<<<Not only a test here!>>>");
string_info (st);
if (1 == string_starts_with (st, "<<<"))
printf ("Starts with <<< !\n");
if (1 == string_ends_with (st, ">>>"))
printf ("Ends with >>> !\n");
string_free (st);
}
编译运行,结果如下:
songvm@ubuntu:~/works/xdn/soo$ gcc string.c -o string
songvm@ubuntu:~/works/xdn/soo$ ./string
<<<Not only a test here!>>>
Page : 4, Length : 27
Starts with <<< !
Ends with >>> !
------------------------------
songvm@ubuntu:~/works/xdn/soo$
字符串取字符索引 INDEXOF 和大小写字母转换
- 字符串取字符索引函数 string_indexof_char
- 字符串转小写 string_to_lower_case
- 字符串转大写 string_to_upper_case
代码如下:
/* get index of char, if not found return -1 */
int
string_indexof_char (String *st, char c)
{
int idx = -1;
for (int i = 0; i < st->length; i++)
if (st->elts[i] == c)
{ idx = i; break; }
return idx;
}
/* to lower case */
void
string_to_lower_case (String *st)
{
for (int i = 0; i < st->length; i++)
if (st->elts[i] >= 'A' && st->elts[i] <= 'Z')
st->elts[i] = st->elts[i] + 32;
}
/* to upper case */
void
string_to_upper_case (String *st)
{
for (int i = 0; i < st->length; i++)
if (st->elts[i] >= 'a' && st->elts[i] <= 'z')
st->elts[i] = st->elts[i] - 32;
}
- 测试函数test_string_indexof,test_string_to代码如下:
/**/
void
test_string_indexof (void)
{
String *st = string_new ("Aha test here!");
string_info (st);
printf ("Index of char [e] is %d\n", string_indexof_char (st, 'e'));
printf ("Index of char [X] is %d\n", string_indexof_char (st, 'X'));
string_free (st);
}
/**/
void
test_string_to (void)
{
String *st = string_new ("Not only a test!");
string_info (st);
string_to_upper_case (st);
string_info (st);
string_to_lower_case (st);
string_info (st);
string_free (st);
}
编译运行,结果如下:
songvm@ubuntu:~/works/xdn/soo$ gcc string.c -o string
songvm@ubuntu:~/works/xdn/soo$ ./string
Aha test here!
Page : 2, Length : 14
Index of char [e] is 5
Index of char [X] is -1
------------------------------
Not only a test!
Page : 3, Length : 16
NOT ONLY A TEST!
Page : 3, Length : 16
not only a test!
Page : 3, Length : 16
------------------------------
songvm@ubuntu:~/works/xdn/soo$
hash算法,求字符串hashcode的算法有很多种,以下罗列了一些,仅供参考
- powxn 简单的求x的n次方函数
- java hashcode method : s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
- string_java_hashcode 代码如下:
/* got x pow n */
static long
powxn (long x, int n)
{
long ln = (long)n;
long t = 1;
while (ln)
{
t *= (ln % 2 ? x : 1);
x *= x;
ln >>= 1;
}
return t;
}
/* java hashcode method */
/* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] */
unsigned int
string_java_hashcode (String *st)
{
unsigned int h = 0;
for (int i = 0, j = st->length - 1; i < st->length; i++, j--)
h = h + st->elts[i] * powxn (31, j); //31 ^ j;
return h;
}
- GLIB中的hash算法
/* another hashcode method */
unsigned int
string_mg_hashcode (String *st)
{
const char *p = st->elts;
unsigned int h = *p;
if (h)
for (p += 1; *p != '\0'; p++)
h = (h << 5) - h + *p;
return h;
}
- ELF 算法
/* ELF */
unsigned int
string_elf_hashcode (String *st)
{
int hash = 0, x = 0;
for (int i = 0; i < st->length; i++)
{
hash = (hash << 4) + st->elts[i];
if ((x = hash & 0xF0000000L) != 0)
hash ^= (x >> 24);
hash &= ~x;
}
return (hash & 0x7FFFFFFF);
}
- JS 算法
/* JS */
unsigned int
string_js_hashcode (String *st)
{
int hash = 1315423911; //not a prime
for (int i = 0; i < st->length; i++)
hash ^= ((hash << 5) + (hash >> 2) + st->elts[i]);
return (hash & 0x7FFFFFFF);
}
- RS 算法
/* RS */
unsigned int
string_rs_hashcode (String *st)
{
int b = 378551; //prime
int a = 63689; //prime
int hash = 0;
for (int i = 0; i < st->length; i++)
{
hash = hash * a + st->elts[i];
a = a * b;
}
return (hash & 0x7FFFFFFF);
}
- PJW 算法
/* PJW */
unsigned int
string_pjw_hashcode (String *st)
{
int BitsInUnsignedInt = 32;
int ThreeQuarters = (BitsInUnsignedInt * 3) / 4;
int OneEighth = BitsInUnsignedInt / 8;
int HighBits = 0xFFFFFFFF << (BitsInUnsignedInt - OneEighth);
int hash = 0;
int test = 0;
for (int i = 0; i < st->length; i++)
{
hash = (hash << OneEighth) + st->elts[i];
if ((test = hash & HighBits) != 0)
hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
}
return (hash & 0x7FFFFFFF);
}
- Jenkins 算法
/* Jenkins */
unsigned int
string_jenkins_hashcode (String *st)
{
unsigned int hash = 0;
char *str = st->elts;
for (unsigned int i = 0; i < st->length; str++, i++)
{
hash += (*str) + (hash << 10);
hash ^= (hash >> 6);
}
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
return (hash & 0x7FFFFFFF);
}
- DJB 算法
/* DJB */
unsigned int
string_djb_hashcode (String *st)
{
unsigned int hash = 5381;
char *str = st->elts;
while (*str)
hash += (hash << 5) + (*str++);
return (hash & 0x7FFFFFFF);
}
- AP 算法
/* AP */
unsigned int
string_ap_hashcode (String *st)
{
unsigned int hash = 0;
char *str = st->elts;
for (int i=0; *str; i++)
{
if ((i & 1) == 0)
hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));
else
hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));
}
return (hash & 0x7FFFFFFF);
}
- 字符串求HASHCODE函数string_hashcode调用以上算法,代码如下:
/* get string hashcode */
unsigned int
string_hashcode (String *st)
{
//return string_elf_hashcode (st);
//return string_rs_hashcode (st);
//return string_js_hashcode (st);
//return string_pjw_hashcode (st);
//return string_java_hashcode (st);
return string_mg_hashcode (st);
//return string_jenkins_hashcode (st);
//return string_djb_hashcode (st);
//return string_ap_hashcode (st);
}
- 测试函数test_string_hashcode代码如下:
/**/
void
test_string_hashcode (void)
{
String *st1 = string_new ("www.runoob.com");
String *st2 = string_new ("Not only a test!");
String *st3 = string_new ("Also a test");
String *st4 = string_new ("Other test");
string_info (st1);
printf ("Hashcode is %d\n", string_hashcode (st1));
string_info (st2);
printf ("Hashcode is %d\n", string_hashcode (st2));
string_info (st3);
printf ("Hashcode is %d\n", string_hashcode (st3));
string_info (st4);
printf ("Hashcode is %d\n", string_hashcode (st4));
string_free (st1);
string_free (st2);
string_free (st3);
string_free (st4);
}
编译运行,结果如下:
songvm@ubuntu:~/works/xdn/soo$ gcc string.c -o string
songvm@ubuntu:~/works/xdn/soo$ ./string
www.runoob.com
Page : 2, Length : 14
Hashcode is 321005537
Not only a test!
Page : 3, Length : 16
Hashcode is 2443443497
Also a test
Page : 2, Length : 11
Hashcode is 3333693258
Other test
Page : 2, Length : 10
Hashcode is 1753054146
------------------------------
songvm@ubuntu:~/works/xdn/soo$
可以打开string_hashcode函数中的注释来分别调用不同算法查看结果!!!
求HASHCODE在数据结构哈希表中非常重要,涉及到存贮查找的效率问题!!!
string.c 完整代码如下:
/* filename: string.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* compile : gcc string.c -o string
run : ./string */
/* define string page size */
#define SPSIZE 8
/* define String datatype struct _String */
typedef struct _String String;
struct _String {
char *elts;
int length;
int page;
};
/* new string with SPSIZE bytes memory fill 0 */
String *
string_new0 (void)
{
String *str = (String*) malloc (sizeof(String));
str->elts = (char*) malloc (SPSIZE * sizeof(char));
memset (str->elts, 0, SPSIZE);
str->page = 1; str->length = 0;
return str;
}
/* new string from char* */
String *
string_new (char *c)
{
String *str = string_new0 ();
int len = strlen (c);
if (len > SPSIZE)
{
str->page = len/SPSIZE + 1;
str->elts = (char*) realloc (str->elts, str->page * SPSIZE);
memset (str->elts, 0, str->page * SPSIZE);
}
for (int i = 0; i < len; i++)
str->elts[i] = c[i];
str->length = len;
return str;
}
/* free the String */
void
string_free (String *str)
{
free (str->elts);
free (str);
}
/* append char* to string */
void
string_append (String *st, char *ca)
{
int len = st->length + strlen (ca);
if (len > st->page * SPSIZE)
{
st->page = len/SPSIZE + 1;
st->elts = (char*) realloc (st->elts, st->page * SPSIZE);
}
for (int i = st->length, j = 0; i < len; i++, j++)
st->elts[i] = ca[j];
st->elts[len] = 0;
st->length = len;
}
/* pre append char* to string */
void
string_prepend (String *st, char *ca)
{
char *buf, *tmp;
int len = strlen (ca);
int lx = st->length + len;
if (lx >= st->page * SPSIZE)
st->page = lx / SPSIZE + 1;
buf = (char*) malloc (st->page * SPSIZE * sizeof(char));
memset (buf, 0, st->page * SPSIZE);
for (int i = 0; i < len; i++)
buf[i] = ca[i];
for (int i = len, j = 0; i < lx; i++, j++)
buf[i] = st->elts[j];
tmp = st->elts;
st->length = lx;
st->elts = buf;
free (tmp);
}
/* insert char* to string at idx */
void
string_insert (String *st, int idx, char *ca)
{
char *buf, *tmp;
int len = strlen (ca);
int lx = len + st->length;
if (lx >= st->page * SPSIZE)
st->page = lx / SPSIZE + 1;
buf = (char*) malloc (st->page * SPSIZE * sizeof(char));
memset (buf, 0, st->page * SPSIZE);
for (int i = 0; i < idx; i++)
buf[i] = st->elts[i];
for (int j = idx, k = 0; j < len + idx; j++, k++)
buf[j] = ca[k];
for (int i = len + idx, j = idx; i < lx; i++, j++)
buf[i] = st->elts[j];
st->length = lx;
tmp = st->elts;
st->elts = buf;
free (tmp);
}
/* erase all at pos to end */
void
string_erase_all (String *st, int pos)
{
if (pos >= st->length) return; //do nothing
for (int i = pos; i < st->length; i++)
st->elts[i] = 0;
st->length = pos;
}
/* erase section at pos length eq len */
void
string_erase_section (String *st, int pos, int len)
{
if (pos >= st->length) return; //do nothing
for (int i = pos; i < pos + len; i++)
st->elts[i] = 0;
for (int i = pos + len, j = pos; i < st->length; i++, j++)
st->elts[j] = st->elts[i];
for (int i = st->length - len; i < st->length; i++)
st->elts[i] = 0;
st->length = st->length - len;
}
/* string trim space tab newline at head and tail */
void
string_trim (String *st)
{
int start, end;
char *tmp, *buf;
buf = (char*) malloc (st->page * SPSIZE * sizeof(char));
for (int i = 0; i < st->length; i++)
if (st->elts[i] != ' ' && st->elts[i] != '\t' && st->elts[i] != '\n')
{ start = i; break; }
for (int i = st->length - 1; i >=0; i--)
if (st->elts[i] != ' ' && st->elts[i] != '\t' && st->elts[i] != '\n')
{ end = i; break; }
for (int i = start, j = 0; i <= end; i++, j++)
buf[j] = st->elts[i];
st->length = end - start + 1;
tmp = st->elts;
st->elts = buf;
free (tmp);
}
/* reverse string */
void
string_reverse (String *st)
{
for (int i = 0, n = st->length - 1; i < st->length / 2; i++, n--)
{
char t = st->elts[i];
st->elts[i] = st->elts[n];
st->elts[n] = t;
}
}
/* get substring from a string */
String*
string_sub (String *st, int pos, int len)
{
String *tmp = NULL;
int ln = 0;
if (pos >= st->length) return tmp;
if ((pos + len) > st->length)
ln = st->length;
else
ln = pos + len;
tmp= string_new ("");
for (int i = pos, j = 0; i < ln; i++, j++)
tmp->elts[j] = st->elts[i];
tmp->length = len;
return tmp;
}
/* test src eq dst if true return 1 else return 0 */
static int
streq (char *src, char *dst)
{
for (int i = 0; i < strlen (dst); i++)
if (src[i] != dst[i]) return 0;
return 1;
}
/* replace src in string to dst */
void
string_replace (String *st, char *src, char *dst)
{
int i, j, k = -1;
int ls = strlen (src);
int ld = strlen (dst);
char *buf, *tmp = st->elts;
if (ls > st->length)
{ printf ("Info: String no change!\n"); return; }
for (i = 0; i < st->length - ls + 1; i++)
if (1 == streq (&tmp[i], src))
{ k = i; break; }
if (k == -1) { printf ("Info: String not found!\n"); return; }
if (ls == ld)
{
for (i = 0, j = k; j < k + ls; j++, i++)
st->elts[j] = dst[i];
}
else
{
int ln = st->length;
ln = ln + ld - ls;
if (ls < ld)
st->page = ln / SPSIZE + 1;
buf = (char*) malloc (st->page * SPSIZE * sizeof(char));
for (i = 0; i < k; i++)
buf[i] = st->elts[i];
for (int n = 0; n < ld; n++, i++)
buf[i] = dst[n];
for (int n = k + ls; n < st->length; n++, i++)
buf[i] = st->elts[n];
st->length = ln;
tmp = st->elts;
st->elts = buf;
free (tmp);
}
}
/* if string ends with suffix return 1 else return 0 */
int
string_ends_with (String *st, char *suffix)
{
int tmp = 1;
for (int i = st->length - 1, j = strlen (suffix) - 1; j >= 0; j--, i--)
if (st->elts[i] != suffix[j])
{ tmp = 0; break; }
return tmp;
}
/* if string starts with prefix return 1 else return 0 */
int
string_starts_with (String *st, char *prefix)
{
int tmp = 1;
for (int i = 0, j = 0; j < strlen (prefix); j++, i++)
if (st->elts[i] != prefix[j])
{ tmp = 0; break; }
return tmp;
}
/* get index of char, if not found return -1 */
int
string_indexof_char (String *st, char c)
{
int idx = -1;
for (int i = 0; i < st->length; i++)
if (st->elts[i] == c)
{ idx = i; break; }
return idx;
}
/* to lower case */
void
string_to_lower_case (String *st)
{
for (int i = 0; i < st->length; i++)
if (st->elts[i] >= 'A' && st->elts[i] <= 'Z')
st->elts[i] = st->elts[i] + 32;
}
/* to upper case */
void
string_to_upper_case (String *st)
{
for (int i = 0; i < st->length; i++)
if (st->elts[i] >= 'a' && st->elts[i] <= 'z')
st->elts[i] = st->elts[i] - 32;
}
/* got x pow n */
static long
powxn (long x, int n)
{
long ln = (long)n;
long t = 1;
while (ln)
{
t *= (ln % 2 ? x : 1);
x *= x;
ln >>= 1;
}
return t;
}
/* java hashcode method */
/* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] */
unsigned int
string_java_hashcode (String *st)
{
unsigned int h = 0;
for (int i = 0, j = st->length - 1; i < st->length; i++, j--)
h = h + st->elts[i] * powxn (31, j); //31 ^ j;
return h;
}
/* another hashcode method */
unsigned int
string_mg_hashcode (String *st)
{
const char *p = st->elts;
unsigned int h = *p;
if (h)
for (p += 1; *p != '\0'; p++)
h = (h << 5) - h + *p;
return h;
}
/* ELF */
unsigned int
string_elf_hashcode (String *st)
{
int hash = 0, x = 0;
for (int i = 0; i < st->length; i++)
{
hash = (hash << 4) + st->elts[i];
if ((x = hash & 0xF0000000L) != 0)
hash ^= (x >> 24);
hash &= ~x;
}
return (hash & 0x7FFFFFFF);
}
/* JS */
unsigned int
string_js_hashcode (String *st)
{
int hash = 1315423911; //not a prime
for (int i = 0; i < st->length; i++)
hash ^= ((hash << 5) + (hash >> 2) + st->elts[i]);
return (hash & 0x7FFFFFFF);
}
/* RS */
unsigned int
string_rs_hashcode (String *st)
{
int b = 378551; //prime
int a = 63689; //prime
int hash = 0;
for (int i = 0; i < st->length; i++)
{
hash = hash * a + st->elts[i];
a = a * b;
}
return (hash & 0x7FFFFFFF);
}
/* PJW */
unsigned int
string_pjw_hashcode (String *st)
{
int BitsInUnsignedInt = 32;
int ThreeQuarters = (BitsInUnsignedInt * 3) / 4;
int OneEighth = BitsInUnsignedInt / 8;
int HighBits = 0xFFFFFFFF << (BitsInUnsignedInt - OneEighth);
int hash = 0;
int test = 0;
for (int i = 0; i < st->length; i++)
{
hash = (hash << OneEighth) + st->elts[i];
if ((test = hash & HighBits) != 0)
hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
}
return (hash & 0x7FFFFFFF);
}
/* Jenkins */
unsigned int
string_jenkins_hashcode (String *st)
{
unsigned int hash = 0;
char *str = st->elts;
for (unsigned int i = 0; i < st->length; str++, i++)
{
hash += (*str) + (hash << 10);
hash ^= (hash >> 6);
}
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
return (hash & 0x7FFFFFFF);
}
/* DJB */
unsigned int
string_djb_hashcode (String *st)
{
unsigned int hash = 5381;
char *str = st->elts;
while (*str)
hash += (hash << 5) + (*str++);
return (hash & 0x7FFFFFFF);
}
/* AP */
unsigned int
string_ap_hashcode (String *st)
{
unsigned int hash = 0;
char *str = st->elts;
for (int i=0; *str; i++)
{
if ((i & 1) == 0)
hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));
else
hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));
}
return (hash & 0x7FFFFFFF);
}
/* get string hashcode */
unsigned int
string_hashcode (String *st)
{
//return string_elf_hashcode (st);
//return string_rs_hashcode (st);
//return string_js_hashcode (st);
//return string_pjw_hashcode (st);
//return string_java_hashcode (st);
return string_mg_hashcode (st);
//return string_jenkins_hashcode (st);
//return string_djb_hashcode (st);
//return string_ap_hashcode (st);
}
/* ------------------------------ */
/* output string infomation for test */
void
string_info (String *st)
{
printf ("%s\n", st->elts);
printf ("Page : %d, Length : %d\n", st->page, st->length);
}
/**/
void
test_string_new (void)
{
String *sta = string_new ("");
String *stb = string_new ("Not only a test!");
string_info (sta);
string_info (stb);
string_free (sta);
string_free (stb);
}
/**/
void
test_string_append (void)
{
String *st = string_new ("Not");
string_info (st);
string_append (st, " only");
string_info (st);
string_append (st, " a");
string_info (st);
string_append (st, " test");
string_info (st);
string_append (st, " here!");\
string_info (st);
string_free (st);
}
/**/
void
test_string_prepend (void)
{
String *st = string_new ("AAA");
string_info (st);
string_prepend (st, "BBB ");
string_info (st);
string_prepend (st, "CCC ");
string_info (st);
string_prepend (st, "DDD ");
string_info (st);
string_prepend (st, "EEE ");
string_info (st);
string_free (st);
}
/**/
void
test_string_insert (void)
{
String *st = string_new ("AA AA");
string_info (st);
string_insert (st, 3, "BB BB");
string_info (st);
string_insert (st, 6, "CC CC");
string_info (st);
string_insert (st, 9, "DD DD");
string_info (st);
string_insert (st, 12, "EE EE");
string_info (st);
string_free (st);
}
/**/
void
test_string_erase (void)
{
String *st = string_new ("AAABBBCCCXXXYYYZZZ");
string_info (st);
string_erase_all (st, 8);
string_info (st);
string_free (st);
st = string_new ("AAABBBCCCXXXYYYZZZ");
string_erase_section (st, 8, 7);
string_info (st);
string_free (st);
}
/**/
void
test_string_trim (void)
{
String *sta = string_new ("www.baidu.com");
String *stb = string_new (" www.baidu.com");
String *stc = string_new ("www.baidu.com ");
String *std = string_new (" www.baidu.com ");
string_trim (sta);
string_info (sta);
string_trim (stb);
string_info (stb);
string_trim (stc);
string_info (stc);
string_trim (std);
string_info (std);
string_free (sta);
string_free (stb);
string_free (stc);
string_free (std);
}
/**/
void
test_string_reverse (void)
{
String *st = string_new ("ABCDEFGHIJKLMNOPQRSTUVWXYZ0");
string_info (st);
string_reverse (st);
string_info (st);
string_free (st);
}
/**/
void
test_string_sub (void)
{
String *tmp;
String *st = string_new ("Another string object test!");
string_info (st);
tmp = string_sub (st, 8, 6);
if (tmp == NULL)
printf ("Get substring is NULL!\n");
else
{
string_info (tmp);
string_free (tmp);
}
string_free (st);
}
/**/
void
test_string_replace (void)
{
String *sa, *st;
st = string_new ("Not only a test here!");
string_info (st);
printf ("--------------\nreplace a to XXXX\n");
string_replace (st, "a", "XXXX");
string_info (st);
printf ("--------------\nreplace XXXX to a\n");
string_replace (st, "XXXX", "a");
string_info (st);
printf ("--------------\n");
sa = string_new ("Hello [name], good lucky!");
string_info (sa);
string_replace (sa, "[name]", "Jack Tomson");
string_info (sa);
string_free (sa);
string_free (st);
}
/**/
void
test_string_with (void)
{
String *st = string_new ("<<<Not only a test here!>>>");
string_info (st);
if (1 == string_starts_with (st, "<<<"))
printf ("Starts with <<< !\n");
if (1 == string_ends_with (st, ">>>"))
printf ("Ends with >>> !\n");
string_free (st);
}
/**/
void
test_string_indexof (void)
{
String *st = string_new ("Aha test here!");
string_info (st);
printf ("Index of char [e] is %d\n", string_indexof_char (st, 'e'));
printf ("Index of char [X] is %d\n", string_indexof_char (st, 'X'));
string_free (st);
}
/**/
void
test_string_to (void)
{
String *st = string_new ("Not only a test!");
string_info (st);
string_to_upper_case (st);
string_info (st);
string_to_lower_case (st);
string_info (st);
string_free (st);
}
/**/
void
test_string_hashcode (void)
{
String *st1 = string_new ("www.runoob.com");
String *st2 = string_new ("Not only a test!");
String *st3 = string_new ("Also a test");
String *st4 = string_new ("Other test");
string_info (st1);
printf ("Hashcode is %u\n", string_hashcode (st1));
string_info (st2);
printf ("Hashcode is %u\n", string_hashcode (st2));
string_info (st3);
printf ("Hashcode is %u\n", string_hashcode (st3));
string_info (st4);
printf ("Hashcode is %u\n", string_hashcode (st4));
string_free (st1);
string_free (st2);
string_free (st3);
string_free (st4);
}
/**/
#define outline() printf ("------------------------------\n")
/**/
int
main (int argc, char *argv[])
{
//test_string_new (); outline ();
//test_string_append (); outline ();
//test_string_prepend (); outline ();
//test_string_insert (); outline ();
//test_string_erase (); outline ();
//test_string_trim (); outline ();
//test_string_reverse (); outline ();
//test_string_sub (); outline();
//test_string_replace (); outline ();
//test_string_with (); outline ();
//test_string_indexof (); outline ();
//test_string_to (); outline ();
test_string_hashcode (); outline ();
return 0;
}
/* --):-o-:(-- */