Driver86
@Driver86
Немодератор toster.ru

Насколько хороша идея использовать только часть sha1 как bigint?

Данные будут добавляется примерно 10 тыс в час.
Какие шансы получить коллизию, если использовать только первые 16 символов (как unsigned bigint) от sha1 строки в 100-500 символов utf-8?
В идеале если 50 лет коллизия не грозит - отлично.
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
Driver86
@Driver86 Автор вопроса
Немодератор toster.ru
Вобщем, тесты показали: даже 14 символов sha1 достаточно для уникальности 1 млрд таких вот хэшей (~12 лет при моей нагрузке).

<?php

declare(strict_types=1);
declare(ticks=1);

error_reporting(E_ALL);
ini_set('display_errors', '1');

function gmp_base_convert($number, int $frombase, int $tobase): string
{
    return gmp_strval(gmp_init($number, $frombase), $tobase);
}

$c = 0;

$t = [];

for ($i = 0; $i < 1000000000; $i++) {

    $s = uniqid((string)$i, true) . microtime() . $i;

    $n = rand(0, 500);

    for ($j = 0; $j < $n; $j++) {
        $s .= chr(rand(0, 255));
    }

    $v = (string)sha1($s);
    $k = (int)gmp_base_convert(substr($v, 0, 14), 16, 10);

    if (isset($t[$k])) {
        $c++;
        echo "{$i}: {$c}\n";
    } else {
        $t[$k] = true;
    }

}

echo "{$i}: {$c}\n";

exit(0);


А уж 16 - и подавно хватит за глаза.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
samodum
@samodum
Какой вопрос - такой и ответ
Шансы получить коллизию огромны.
Подсчитать элементарно.
Коллизии будут ежедневно. Ни о каких 50 годах и речи быть не может
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы