Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:
function __construct() {<br />
parent::__construct();<br />
$this->load->library('CommonMethods');<br />
}<br />
$config = array();<br />
$config['upload_path'] = 'assets/upload/images/';<br />
$config['allowed_types'] = 'gif|jpg|png|jpeg';<br />
$config['max_width'] = 150;<br />
$config['max_height'] = 150;<br />
$config['encrypt_name'] = TRUE;<br />
$config['overwrite'] = FALSE;<br />
// upload multiplefiles<br />
$fileUploadResponse = $this->commonmethods->do_upload_multiple_files('profile_picture', $config);
/**
* do_upload_multiple_files - Multiple Methods
* @param type $fieldName
* @param type $options
* @return type
*/
public function do_upload_multiple_files($fieldName, $options) {
$response = array();
$files = Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:
[110]
[111]FILES;
$cpt = count( Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:
[110]
[111]FILES[$fieldName]['name']);
for($i=0; $i<$cpt; $i++)
{
Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:
[110]
[111]FILES[$fieldName]['name']= $files[$fieldName]['name'][$i];
Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:
[110]
[111]FILES[$fieldName]['type']= $files[$fieldName]['type'][$i];
Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:
[110]
[111]FILES[$fieldName]['tmp_name']= $files[$fieldName]['tmp_name'][$i];
Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:
[110]
[111]FILES[$fieldName]['error']= $files[$fieldName]['error'][$i];
Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:
[110]
[111]FILES[$fieldName]['size']= $files[$fieldName]['size'][$i];
$this->CI->load->library('upload');
$this->CI->upload->initialize($options);
//upload the image
if (!$this->CI->upload->do_upload($fieldName)) {
$response['erros'][] = $this->CI->upload->display_errors();
} else {
$response['result'][] = $this->CI->upload->data();
}
}
return $response;
}
Если вам не нужны дополнительные функции CRC32 (являющиеся линейным кодом), у вас должно быть все в порядке с сокращением вывода до 32 бит.
Вредит ли сокращение вывода некоторых криптографических хеш-функций их безопасности в отношении устойчивости к коллизиям, является открытой проблемой исследования (существуют "неестественные" построенные примеры, если я правильно помню) . Но NIST (вероятно, с одобрения NSA) все равно использовал технику вырезания, чтобы получить SHA-224 из SHA-256 (см. статью о SHA в википедии ).
EDIT: CRC32 позволяет обнаруживать (и, возможно, исправлять) однобитовые ошибки, тогда как криптографическая хеш-функция должна иметь свойство, заключающееся в том, что вы не можете найти два входа с одинаковым хеш-значением.
Известно ли вам о «парадоксе дня рождения» (см. снова википедию) )? С 32-битной контрольной суммой вы ожидаете столкновения (т. Е. два входа с одинаковым значением хэш-функции), когда у вас есть около 2 ^ 16 входов, и вы хотите хешировать гораздо больше входов. (Если вы перечитаете ваш комментарий, это не будет проблемой для вас.)
Как писали другие, вам нужно будет опросить INSERTED и DELETED. Однако использование «родной» 32-битной хеш-функции, вероятно, будет лучшим выбором. Может быть, кто-то, кто разбирается в этом вопросе, может дать нам лучшую причину, чем просто мое чутье :)
Если вы не собираетесь использовать 32-битные биты для криптографических целей, тогда все будет в порядке. В противном случае я бы не стал полагаться на то, что первые 32 бита будут иметь такое же распределение, как и весь хэш.
Почему вы не можете просто использовать более широкий доступный хеш?
CRC32, вероятно, подходит для ваших нужд. Это обсуждалось в , этот вопрос .
С точки зрения усечения примитива хеширования, единственным широко используемым приложением этого является псевдослучайная функция (PRF) SSL / TLS , которая используется для генерации ключей. Он использует HMAC, начальные числа и метки для генерации столько байтов, сколько вам нужно, путем многократного хеширования с последующим усечением до необходимого количества байтов.
Что касается вашего конкретного вопроса, вы можете прочитать вывод хеша в Int32, а затем xor их вместе, если вы параноик:
static void Main()
{
int xorCrc = GetHashedCrc(new SHA1Cng(), new byte[] {0xDE, 0xAD, 0xBE, 0xEF});
}
private static int GetHashedCrc(HashAlgorithm algorithm, byte[] bytesToHash)
{
byte[] hash = algorithm.ComputeHash(bytesToHash);
int totalInt32s = hash.Length/sizeof(int);
int result = 0;
for(int i = 0; i < totalInt32s; i++)
{
int currentInt = BitConverter.ToInt32(hash, sizeof(int)*i);
result = result ^ currentInt;
}
return result;
}
Почему бы вам просто не использовать string.GetHashCode (). Он предназначен для вычисления 32-битного хеш-значения и создания нескольких коллизий с учетом реальных данных. Конечно, это небезопасно, но ваш вопрос не включает это как требование.