Функция crc32
выводит 32-разрядное число без знака, и код проверяет, меньше ли значение CRC, чем test_ratio, умноженное на максимальное 32-разрядное число.
Есть маска & 0xffffffff
только до обеспечить совместимость с Python 2 и 3 .В Python 2 та же функция может возвращать целое число со знаком в диапазоне от - (2 ^ 31) до (2 ^ 31) - 1, маскирование этого с помощью маски 0xffffffff
нормализует значение доподпись.
Таким образом, любая версия превращает идентификатор в целое число, а хеш используется для того, чтобы это целое число было равномерно распределено в диапазоне;для хэша MD5 это последний байт, в котором значение падает между 0 и 255, для контрольной суммы CRC32 значение лежит между 0 и (2 ^ 32) -1.Это целое число затем сравнивается с полным диапазоном;если она опускается ниже точки отсечения test_ratio * maximum
, она считается выбранной.
Вы также можете использовать случайную функцию, но тогда вы будете получать различное подмножество своего ввода каждый раз, когда выбирали сэмпл;хешируя идентификатор, вы получаете согласованное подмножество .Разница между этими двумя методами заключается в том, что они будут создавать разные подмножества, так что вы можете использовать оба вместе, чтобы выбрать несколько независимых подмножеств из одного входа.
Сравнить:
>>> import numpy as np
>>> from zlib import crc32
>>> from hashlib import md5
>>> import random
>>> identifier = np.int64(random.randrange(2**63))
>>> md5(identifier).digest()[-1]
243
>>> md5(identifier).digest()[-1] / 256 # as a ratio of the full range
0.94921875
>>> crc32(identifier)
4276259108
>>> crc32(identifier) / (2 ** 32) # ratio again
0.9956441605463624
>>> identifier = np.int64(random.randrange(2**63)) # different id to compare
>>> md5(identifier).digest()[-1] / 256 # as a ratio of the full range
0.83203125
>>> crc32(identifier) / (2 ** 32) # ratio again
0.10733163682743907
Таким образом, два разных метода дают разные выходные данные, но пока хеши CRC32 и MD5 выдают разумно равномерно распределенные значения хеш-функции, то любой из них даст вам приемлемую частоту дискретизации 20%.