| #!/usr/bin/env python |
| # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| try: |
| import hashlib |
| _new_md5 = hashlib.md5 |
| except ImportError: |
| import md5 |
| _new_md5 = md5.new |
| |
| |
| """64-bit fingerprint support for strings. |
| |
| Usage: |
| from extern import FP |
| print 'Fingerprint is %ld' % FP.FingerPrint('Hello world!') |
| """ |
| |
| |
| def _UnsignedFingerPrintImpl(str, encoding='utf-8'): |
| """Generate a 64-bit fingerprint by taking the first half of the md5 |
| of the string. |
| """ |
| hex128 = _new_md5(str).hexdigest() |
| int64 = long(hex128[:16], 16) |
| return int64 |
| |
| |
| def UnsignedFingerPrint(str, encoding='utf-8'): |
| """Generate a 64-bit fingerprint. |
| |
| The default implementation uses _UnsignedFingerPrintImpl, which |
| takes the first half of the md5 of the string, but the |
| implementation may be switched using SetUnsignedFingerPrintImpl. |
| """ |
| return _UnsignedFingerPrintImpl(str, encoding) |
| |
| |
| def FingerPrint(str, encoding='utf-8'): |
| fp = UnsignedFingerPrint(str, encoding=encoding) |
| # interpret fingerprint as signed longs |
| if fp & 0x8000000000000000L: |
| fp = - ((~fp & 0xFFFFFFFFFFFFFFFFL) + 1) |
| return fp |
| |
| |
| def UseUnsignedFingerPrintFromModule(module_name): |
| """Imports module_name and replaces UnsignedFingerPrint in the |
| current module with the function of the same name from the imported |
| module. |
| |
| Returns the function object previously known as |
| grit.extern.FP.UnsignedFingerPrint. |
| """ |
| hash_module = __import__(module_name, fromlist=[module_name]) |
| return SetUnsignedFingerPrint(hash_module.UnsignedFingerPrint) |
| |
| |
| def SetUnsignedFingerPrint(function_object): |
| """Sets grit.extern.FP.UnsignedFingerPrint to point to |
| function_object. |
| |
| Returns the function object previously known as |
| grit.extern.FP.UnsignedFingerPrint. |
| """ |
| global UnsignedFingerPrint |
| original_function_object = UnsignedFingerPrint |
| UnsignedFingerPrint = function_object |
| return original_function_object |