| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env python | |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 3 # Use of this source code is governed by a BSD-style license that can be | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 try: | |
| 7 import hashlib | |
| 8 _new_md5 = hashlib.md5 | |
| 9 except ImportError: | |
| 10 import md5 | |
| 11 _new_md5 = md5.new | |
| 12 | |
| 13 | |
| 14 """64-bit fingerprint support for strings. | |
| 15 | |
| 16 Usage: | |
| 17 from extern import FP | |
| 18 print 'Fingerprint is %ld' % FP.FingerPrint('Hello world!') | |
| 19 """ | |
| 20 | |
| 21 | |
| 22 def _UnsignedFingerPrintImpl(str, encoding='utf-8'): | |
| 23 """Generate a 64-bit fingerprint by taking the first half of the md5 | |
| 24 of the string. | |
| 25 """ | |
| 26 hex128 = _new_md5(str).hexdigest() | |
| 27 int64 = long(hex128[:16], 16) | |
| 28 return int64 | |
| 29 | |
| 30 | |
| 31 def UnsignedFingerPrint(str, encoding='utf-8'): | |
| 32 """Generate a 64-bit fingerprint. | |
| 33 | |
| 34 The default implementation uses _UnsignedFingerPrintImpl, which | |
| 35 takes the first half of the md5 of the string, but the | |
| 36 implementation may be switched using SetUnsignedFingerPrintImpl. | |
| 37 """ | |
| 38 return _UnsignedFingerPrintImpl(str, encoding) | |
| 39 | |
| 40 | |
| 41 def FingerPrint(str, encoding='utf-8'): | |
| 42 fp = UnsignedFingerPrint(str, encoding=encoding) | |
| 43 # interpret fingerprint as signed longs | |
| 44 if fp & 0x8000000000000000L: | |
| 45 fp = - ((~fp & 0xFFFFFFFFFFFFFFFFL) + 1) | |
| 46 return fp | |
| 47 | |
| 48 | |
| 49 def UseUnsignedFingerPrintFromModule(module_name): | |
| 50 """Imports module_name and replaces UnsignedFingerPrint in the | |
| 51 current module with the function of the same name from the imported | |
| 52 module. | |
| 53 | |
| 54 Returns the function object previously known as | |
| 55 grit.extern.FP.UnsignedFingerPrint. | |
| 56 """ | |
| 57 hash_module = __import__(module_name, fromlist=[module_name]) | |
| 58 return SetUnsignedFingerPrint(hash_module.UnsignedFingerPrint) | |
| 59 | |
| 60 | |
| 61 def SetUnsignedFingerPrint(function_object): | |
| 62 """Sets grit.extern.FP.UnsignedFingerPrint to point to | |
| 63 function_object. | |
| 64 | |
| 65 Returns the function object previously known as | |
| 66 grit.extern.FP.UnsignedFingerPrint. | |
| 67 """ | |
| 68 global UnsignedFingerPrint | |
| 69 original_function_object = UnsignedFingerPrint | |
| 70 UnsignedFingerPrint = function_object | |
| 71 return original_function_object | |
| OLD | NEW |