<?php
/*
Při číselných indexech je první kolize hashe
v případě intervalu 1000 se vyhledává v položkách pole, kde kolize klíčů není.
Zvětšíme-li hodnotu intervalu (např zmiňovaných 2000000, začneme vyhledávat i v klíčích s kolizí.
*/
define('INTERVAL', 1000);
/* DJBX33A Hash function implemented in PHP */
function DJBX33A($key) {
$hash = 5381;
if (is_int($key)) {
$key = pack("I*", $key);
}
for ($i = 0, $c = strlen($key); $i < $c; $i++) {
$hash = (($hash << 5) + $hash) + ord($key[$i]);
}
return $hash;
}
$col = [];
$f = false;
$arr = [];
for ($i = 0; $i < 2000000; $i++) {
$arr[$i] = ['a' => 1+1];
$col[DJBX33A($i)] += 1;
if(!$f && $col[DJBX33A($i)] > 1) {
var_dump(array($i, DJBX33A($i)));
$f = true;
die();
}
//if($i < INTERVAL) $deb[DJBX33A($i)] = $col[DJBX33A($i)];
}
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
$arr[mt_rand(0, INTERVAL-1)];
}
$time = microtime(true) - $start;
$deb = $col;
var_dump(count($deb));
arsort($deb);
var_dump(array_slice($deb, 0, 15, true));
var_dump($time);
preferences:
32.97 ms | 402 KiB | 5 Q