Генерация целочисленного хеш-кода для любого значения PHP

Я ищу способ, в PHP, чтобы генерировать целочисленный хеш-код для любого значения — примитивных типов или пользовательских классов (для структуры типа три). Этот хэш должен иметь следующие свойства:

  1. Для объектов $x а также $y где $x === $y, hashCode($x) === hashCode($y)
  2. Вернуть 32-битное значение
  3. В идеале хеш-функция была бы хорошо распределена (т.е. не слишком много коллизий)
  4. Как можно быстрее (без написания расширения C)

Лучшее, что я могу придумать, — это получить хеш строки и преобразовать его в целое число:

<?php

function hashCode($o) {
// Get a string hash for the value
if( is_object($o) ) {
// For objects, use spl_object_hash
$strHash = spl_object_hash($o);
}
else {
// Now we know we have a primitive type

// For arrays, first hash the contents
if( is_array($o) )
$o = array_map(function($x) { return hashCode($x); }, $o);

// Use serialisation to get a string for the primitive
// NOTE: We could use casting to a string since, however this will
//       lead to more collisions since, for instance,
//       (string)true === '1'
//       Also, casting a float to a string causes it to lose precision,
//       meaning more collisions
//       Maybe this is OK though...
// We use md5 to reduce the size (think serialising a large string)
$strHash = md5(serialize($o));
}

// Convert the string hash to a 32-bit integer
return crc32($strHash);
}

Интересно, есть ли у кого-нибудь другие идеи? Мне хэширование массива кажется особенно сложным и потенциально медленным. Кроме того, я не могу не думать, что мне не хватает метода, чтобы перейти прямо к целому числу, или альтернатива serialize/md5/crc32

1

Решение

Это все варианты хеширования, которые я смог найти.

Работает для строки, но также может быть преобразовано в массивы / объекты.

/**
* Make a control key with the string containing datas
*
* @param  string $data        Data
* @param  string $controlType Type of control 'md5', 'crc32' or 'strlen'
* @throws Zend_Cache_Exception
* @return string Control key
*/
protected function _hash($data, $controlType)
{
switch ($controlType) {
case 'md5':
return md5($data);
case 'crc32':
return crc32($data);
case 'strlen':
return strlen($data);
case 'adler32':
return hash('adler32', $data);
default:
Zend_Cache::throwException("Incorrect hash function : $controlType");
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]