Commit | Line | Data |
---|---|---|
5b1830f3 MW |
1 | ### -*-pyrex-*- |
2 | ### | |
3 | ### Universal hashing interface | |
4 | ### | |
5 | ### (c) 2005 Straylight/Edgeware | |
6 | ### | |
20bce5e9 | 7 | |
5b1830f3 MW |
8 | ###----- Licensing notice --------------------------------------------------- |
9 | ### | |
10 | ### This file is part of the Python interface to mLib. | |
11 | ### | |
12 | ### mLib/Python is free software; you can redistribute it and/or modify | |
13 | ### it under the terms of the GNU General Public License as published by | |
14 | ### the Free Software Foundation; either version 2 of the License, or | |
15 | ### (at your option) any later version. | |
16 | ### | |
17 | ### mLib/Python is distributed in the hope that it will be useful, | |
18 | ### but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 | ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 | ### GNU General Public License for more details. | |
21 | ### | |
22 | ### You should have received a copy of the GNU General Public License | |
23 | ### along with mLib/Python; if not, write to the Free Software Foundation, | |
24 | ### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
20bce5e9 | 25 | |
20bce5e9 | 26 | def setglobalkey(uint32 k): |
addc0c37 | 27 | """setglobalkey(K): set global hash key""" |
20bce5e9 | 28 | unihash_setkey(&unihash_global, k) |
29 | ||
efb0bf0e | 30 | cdef class UnihashKey: |
addc0c37 | 31 | """Key(K): universal hashing key""" |
20bce5e9 | 32 | cdef unihash_info _i |
efb0bf0e | 33 | cdef readonly uint32 k |
376ad06d | 34 | def __cinit__(me, uint32 k): |
20bce5e9 | 35 | unihash_setkey(&me._i, k) |
efb0bf0e MW |
36 | me.k = k |
37 | def hash(me, object data): | |
38 | return _unihash_hash(me, data) | |
39 | ||
40 | ## DEPRECATED: compatibility hack | |
41 | Key = UnihashKey | |
42 | ||
43 | cdef const unihash_info *_unihash_keydata(UnihashKey key): | |
44 | if key is None: | |
45 | return &unihash_global | |
46 | else: | |
47 | return &key._i | |
48 | ||
49 | cdef uint32 _unihash_hash(UnihashKey key, object data): | |
50 | cdef const void *p | |
51 | cdef Py_ssize_t n | |
52 | cdef const unihash_info *i = _unihash_keydata(key) | |
53 | PyObject_AsReadBuffer(data, &p, &n) | |
54 | return unihash_hash(i, UNIHASH_INIT(i), p, n) | |
20bce5e9 | 55 | |
56 | cdef class Unihash: | |
addc0c37 | 57 | """Unihash([key = None]): universal hashing context""" |
20bce5e9 | 58 | cdef uint32 _a |
efb0bf0e MW |
59 | cdef readonly UnihashKey key |
60 | cdef const unihash_info *_i | |
61 | def __init__(me, UnihashKey key = None): | |
20bce5e9 | 62 | me.key = key |
efb0bf0e | 63 | me._i = _unihash_keydata(key) |
20bce5e9 | 64 | me._a = UNIHASH_INIT(me._i) |
65 | def chunk(me, data): | |
efb0bf0e MW |
66 | """U.chunk(BYTES): hash the STR""" |
67 | cdef const void *p | |
78911cdb | 68 | cdef Py_ssize_t n |
efb0bf0e | 69 | PyObject_AsReadBuffer(data, &p, &n) |
20bce5e9 | 70 | me._a = unihash_hash(me._i, me._a, p, n) |
efb0bf0e | 71 | return me |
20bce5e9 | 72 | def done(me): |
addc0c37 | 73 | """U.done() -> INT: the hash of the data""" |
efb0bf0e MW |
74 | return me._a |
75 | @classmethod | |
76 | def hash(cls, data, UnihashKey key = None): | |
77 | """Unihash.hash(BYTES, [key = None]) -> INT: the hash of the data""" | |
78 | return _unihash_hash(key, data) | |
20bce5e9 | 79 | |
5b1830f3 | 80 | ###----- That's all, folks -------------------------------------------------- |