hashes.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Keyed 32-bit hash function using TEA in a Davis-Meyer function
  3.  *   H0 = Key
  4.  *   Hi = E Mi(Hi-1) + Hi-1
  5.  *
  6.  * (see Applied Cryptography, 2nd edition, p448).
  7.  *
  8.  * Jeremy Fitzhardinge <jeremy@zip.com.au> 1998
  9.  * 
  10.  * Jeremy has agreed to the contents of reiserfs/README. -Hans
  11.  * Yura's function is added (04/07/2000)
  12.  */
  13. //
  14. // keyed_hash
  15. // yura_hash
  16. // r5_hash
  17. //
  18. #include <asm/types.h>
  19. #define DELTA 0x9E3779B9
  20. #define FULLROUNDS 10 /* 32 is overkill, 16 is strong crypto */
  21. #define PARTROUNDS 6 /* 6 gets complete mixing */
  22. /* a, b, c, d - data; h0, h1 - accumulated hash */
  23. #define TEACORE(rounds)
  24. do {
  25. u32 sum = 0;
  26. int n = rounds;
  27. u32 b0, b1;
  28. b0 = h0;
  29. b1 = h1;
  30. do
  31. {
  32. sum += DELTA;
  33. b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b);
  34. b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d);
  35. } while(--n);
  36. h0 += b0;
  37. h1 += b1;
  38. } while(0)
  39. u32 keyed_hash(const signed char *msg, int len)
  40. {
  41. u32 k[] = { 0x9464a485, 0x542e1a94, 0x3e846bff, 0xb75bcfc3}; 
  42. u32 h0 = k[0], h1 = k[1];
  43. u32 a, b, c, d;
  44. u32 pad;
  45. int i;
  46.  
  47. // assert(len >= 0 && len < 256);
  48. pad = (u32)len | ((u32)len << 8);
  49. pad |= pad << 16;
  50. while(len >= 16)
  51. {
  52. a = (u32)msg[ 0]      |
  53.     (u32)msg[ 1] << 8 |
  54.     (u32)msg[ 2] << 16|
  55.     (u32)msg[ 3] << 24;
  56. b = (u32)msg[ 4]      |
  57.     (u32)msg[ 5] << 8 |
  58.     (u32)msg[ 6] << 16|
  59.     (u32)msg[ 7] << 24;
  60. c = (u32)msg[ 8]      |
  61.     (u32)msg[ 9] << 8 |
  62.     (u32)msg[10] << 16|
  63.     (u32)msg[11] << 24;
  64. d = (u32)msg[12]      |
  65.     (u32)msg[13] << 8 |
  66.     (u32)msg[14] << 16|
  67.     (u32)msg[15] << 24;
  68. TEACORE(PARTROUNDS);
  69. len -= 16;
  70. msg += 16;
  71. }
  72. if (len >= 12)
  73. {
  74.      //assert(len < 16);
  75. if (len >= 16)
  76.     *(int *)0 = 0;
  77. a = (u32)msg[ 0]      |
  78.     (u32)msg[ 1] << 8 |
  79.     (u32)msg[ 2] << 16|
  80.     (u32)msg[ 3] << 24;
  81. b = (u32)msg[ 4]      |
  82.     (u32)msg[ 5] << 8 |
  83.     (u32)msg[ 6] << 16|
  84.     (u32)msg[ 7] << 24;
  85. c = (u32)msg[ 8]      |
  86.     (u32)msg[ 9] << 8 |
  87.     (u32)msg[10] << 16|
  88.     (u32)msg[11] << 24;
  89. d = pad;
  90. for(i = 12; i < len; i++)
  91. {
  92. d <<= 8;
  93. d |= msg[i];
  94. }
  95. }
  96. else if (len >= 8)
  97. {
  98.      //assert(len < 12);
  99. if (len >= 12)
  100.     *(int *)0 = 0;
  101. a = (u32)msg[ 0]      |
  102.     (u32)msg[ 1] << 8 |
  103.     (u32)msg[ 2] << 16|
  104.     (u32)msg[ 3] << 24;
  105. b = (u32)msg[ 4]      |
  106.     (u32)msg[ 5] << 8 |
  107.     (u32)msg[ 6] << 16|
  108.     (u32)msg[ 7] << 24;
  109. c = d = pad;
  110. for(i = 8; i < len; i++)
  111. {
  112. c <<= 8;
  113. c |= msg[i];
  114. }
  115. }
  116. else if (len >= 4)
  117. {
  118.      //assert(len < 8);
  119. if (len >= 8)
  120.     *(int *)0 = 0;
  121. a = (u32)msg[ 0]      |
  122.     (u32)msg[ 1] << 8 |
  123.     (u32)msg[ 2] << 16|
  124.     (u32)msg[ 3] << 24;
  125. b = c = d = pad;
  126. for(i = 4; i < len; i++)
  127. {
  128. b <<= 8;
  129. b |= msg[i];
  130. }
  131. }
  132. else
  133. {
  134.      //assert(len < 4);
  135. if (len >= 4)
  136.     *(int *)0 = 0;
  137. a = b = c = d = pad;
  138. for(i = 0; i < len; i++)
  139. {
  140. a <<= 8;
  141. a |= msg[i];
  142. }
  143. }
  144. TEACORE(FULLROUNDS);
  145. /* return 0;*/
  146. return h0^h1;
  147. }
  148. /* What follows in this file is copyright 2000 by Hans Reiser, and the
  149.  * licensing of what follows is governed by reiserfs/README */
  150. u32 yura_hash (const signed char *msg, int len)
  151. {
  152.     int j, pow;
  153.     u32 a, c;
  154.     int i;
  155.     
  156.     for (pow=1,i=1; i < len; i++) pow = pow * 10; 
  157.     
  158.     if (len == 1) 
  159. a = msg[0]-48;
  160.     else
  161. a = (msg[0] - 48) * pow;
  162.     
  163.     for (i=1; i < len; i++) {
  164. c = msg[i] - 48; 
  165. for (pow=1,j=i; j < len-1; j++) pow = pow * 10; 
  166. a = a + c * pow;
  167.     }
  168.     
  169.     for (; i < 40; i++) {
  170. c = '0' - 48; 
  171. for (pow=1,j=i; j < len-1; j++) pow = pow * 10; 
  172. a = a + c * pow;
  173.     }
  174.     
  175.     for (; i < 256; i++) {
  176. c = i; 
  177. for (pow=1,j=i; j < len-1; j++) pow = pow * 10; 
  178. a = a + c * pow;
  179.     }
  180.     
  181.     a = a << 7;
  182.     return a;
  183. }
  184. u32 r5_hash (const signed char *msg, int len)
  185. {
  186.   u32 a=0;
  187.   while(*msg) { 
  188.     a += *msg << 4;
  189.     a += *msg >> 4;
  190.     a *= 11;
  191.     msg++;
  192.    } 
  193.   return a;
  194. }