]> git.proxmox.com Git - ceph.git/blob - ceph/src/common/rabin.h
import 15.2.0 Octopus source
[ceph.git] / ceph / src / common / rabin.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 /*
4 * Ceph - scalable distributed file system
5 *
6 * Authors : Yuan-Ting Hsieh, Hsuan-Heng Wu, Myoungwon Oh
7 *
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
12 *
13 */
14
15 #ifndef CEPH_COMMON_RABIN_H_
16 #define CEPH_COMMON_RABIN_H_
17
18 class RabinChunk {
19 public:
20 RabinChunk(uint32_t window_size, uint32_t rabin_prime,
21 uint64_t mod_prime, uint64_t pow, vector<uint64_t> rabin_mask, uint64_t min,
22 uint64_t max, uint32_t num_bits):
23 window_size(window_size), rabin_prime(rabin_prime), mod_prime(mod_prime),
24 pow(pow), rabin_mask(rabin_mask), min(min), max(max), num_bits(num_bits) {}
25 RabinChunk() {
26 default_init_rabin_options();
27 }
28
29 void default_init_rabin_options() {
30 vector<uint64_t> _rabin_mask = {0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
31 window_size = 48;
32 rabin_prime = 3;
33 mod_prime = 6148914691236517051;
34 pow = 907234050803559263; // pow(prime, window_size)
35 min = 8000;
36 max = 16000;
37 num_bits = 3;
38 rabin_mask = _rabin_mask;
39 }
40
41 int do_rabin_chunks(bufferlist & inputdata,
42 vector<pair<uint64_t, uint64_t>> & chunks,
43 uint64_t min, uint64_t max);
44 uint64_t gen_rabin_hash(char* chunk_data, uint64_t off, uint64_t len = 0);
45 bool end_of_chunk(const uint64_t fp , int numbits);
46 void set_window_size(uint32_t size) { window_size = size; }
47 void set_rabin_prime(uint32_t r_prime) { rabin_prime = r_prime; }
48 void set_mod_prime(uint64_t m_prime) { mod_prime = m_prime; }
49 void set_pow(uint64_t p) { pow = p; }
50 void set_rabin_mask(vector<uint64_t> & mask) { rabin_mask = mask; }
51 void set_min_chunk(uint32_t c_min) { min = c_min; }
52 void set_max_chunk(uint32_t c_max) { max = c_max; }
53 int add_rabin_mask(uint64_t mask) {
54 rabin_mask.push_back(mask);
55 for (int i = 0; rabin_mask.size(); i++) {
56 if (rabin_mask[i] == mask) {
57 return i;
58 }
59 }
60 return -1;
61 }
62 void set_numbits(uint32_t bit) { num_bits = bit; }
63
64 private:
65
66 uint32_t window_size;
67 uint32_t rabin_prime;
68 uint64_t mod_prime;
69 uint64_t pow;
70 vector<uint64_t> rabin_mask;
71 uint64_t min;
72 uint64_t max;
73 uint32_t num_bits;
74 };
75
76
77 #endif // CEPH_COMMON_RABIN_H_