Как работает функция CRC32 при использовании данных выборки? - PullRequest
0 голосов
/ 01 июня 2018

Я хотел бы спросить вас об объяснении следующей короткой функции в Python ..

from zlib import crc32

def test_set_check(identifier, test_ratio):
    return crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32

Вышеупомянутая функция должна совпадать со следующей функцией:

import hashlib

def test_set_check(identifier, test_ratio, hash=hashlib.md5):
    return hash(np.int64(identifier)).digest()[-1] < 256 * test_ratio

Обе функции следует использовать для выборки данных (выберите несколько строк в таблице).Например, если test_ratio равно 0,2, это означает, что я хочу выбрать 20% данных, значение ниже или равно 51 (~ 20% из 256).Я понимаю, как работает вторая функция, но я не понимаю первую.Не могли бы вы объяснить мне первую функцию?Я не понимаю следующую часть: crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32

1 Ответ

0 голосов
/ 01 июня 2018

Функция 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%.

...