Что лучший способ состоит в том, чтобы генерировать случайный ключ в PHP?

Mirth - это движок интеграции, а его сила в обработке сообщений. Просмотр исторических сообщений иногда может быть затруднен или медленен, в зависимости от настроек хранилища для канала и от того, хотите ли вы извлекать дополнительную информацию во время обработки для хранения в полях «пользовательских метаданных». Пользовательские поля метаданных по умолчанию не индексируются, но вы можете добавить свои собственные (mirth поддерживает несколько внутренних баз данных, включая postgres, mysql, oracle и mssql.) Поиск содержимого сообщения в основном включает полнотекстовый поиск и сканирование , Параметры фильтра для сокращения времени сканирования, помимо созданных вами пользовательских метаданных, в основном связаны со свойствами сообщения (дата-время получения, состояние и т. Д.), А не с содержимым.

Итак, я бы не рекомендовал его для варианта использования, который вы предлагаете.

Тем не менее, Mirth определенно может быть использован для преобразования ваших сообщений (в пакетном режиме из файлов или в реальном времени) в xml, который может быть помещен в базу данных, предназначенную для обработки и запроса больших объемов xml документов. Я предполагаю, что когда вы говорите HL7, вы имеете в виду формат ER7 (с разделителями каналов) HL7v2. Mirth автоматически выполняет преобразование в xml для этих типов сообщений, поскольку они обрабатываются как xml во время обработки. Вы можете легко создать новый родительский узел, который будет содержать как преобразованный xml, так и исходную строку сообщения как дочерние.

Если выбранная вами база данных имеет драйвер JDBC, Java SDK или HTTP / REST API, mirth, вероятно, может напрямую вставить преобразованные сообщения для вас при обработке.

39
задан Maarten Bodewes 29 November 2014 в 14:55
поделиться

3 ответа

Обновление (12/2015): Для PHP 7.0 необходимо использовать random_int() вместо mt_rand, поскольку он обеспечивает "криптографически безопасные значения"

Лично, мне нравится использовать sha1(microtime(true).mt_rand(10000,90000)), но Вы ищете больше настраиваемого подхода, так попробуйте эту функцию (который является модификацией к Вашему запросу этот ответ ):

function rand_char($length) {
  $random = '';
  for ($i = 0; $i < $length; $i++) {
    $random .= chr(mt_rand(33, 126));
  }
  return $random;
}

однако, это, вероятно, будет значительно медленнее, чем uniqid (), md5 (), или sha1 ().

Редактирование: Похож на Вас, добрался до него сначала, извините.: Редактирование D

2: я решил сделать миленький тест на своей машине Debian с PHP 5, и eAccelerator (извините длинный код):

function rand_char($length) {
  $random = '';
  for ($i = 0; $i < $length; $i++) {
    $random .= chr(mt_rand(33, 126));
  }
  return $random;
}

function rand_sha1($length) {
  $max = ceil($length / 40);
  $random = '';
  for ($i = 0; $i < $max; $i ++) {
    $random .= sha1(microtime(true).mt_rand(10000,90000));
  }
  return substr($random, 0, $length);
}

function rand_md5($length) {
  $max = ceil($length / 32);
  $random = '';
  for ($i = 0; $i < $max; $i ++) {
    $random .= md5(microtime(true).mt_rand(10000,90000));
  }
  return substr($random, 0, $length);
}

$a = microtime(true);
for ($x = 0; $x < 1000; $x++)
  $temp = rand_char(1000);

echo "Rand:\t".(microtime(true) - $a)."\n";

$a = microtime(true);
for ($x = 0; $x < 1000; $x++)
  $temp = rand_sha1(1000);

echo "SHA-1:\t".(microtime(true) - $a)."\n";

$a = microtime(true);
for ($x = 0; $x < 1000; $x++)
  $temp = rand_md5(1000);

echo "MD5:\t".(microtime(true) - $a)."\n";

Результаты:

Rand:   2.09621596336
SHA-1:  0.611464977264
MD5:    0.618473052979

, Таким образом, мое предложение, если Вы хотите скорость (но не полный набор символов), состоит в том, чтобы придерживаться MD5, SHA-1 или Uniqid (который я не протестировал.. все же)

57
ответ дан Community 27 November 2019 в 02:18
поделиться

Можно все еще использовать uniqid (), просто сделать некоторую дополнительную обработку для расширения ее значения до количества символов, в которых Вы нуждаетесь.

, Например, для расширения его до 32 символов Вы могли сделать

$id = md5(uniqid());

, Чтобы развернуть его до 64 символов, просто добавить md5 md5, как так

$first = md5(uniqid());
$id = $first . md5($first);

Затем trucate по мере необходимости при необходимости в меньше, чем некоторые несколько из 32.

возможно, что Вы могли столкнуться с коллизиями, но это довольно маловероятно. Если Вы параноики об этом, просто используйте ту же идею, но пыхтение uniqid() через симметричный шифр как AES вместо того, чтобы хешировать его.

8
ответ дан Bob Somers 27 November 2019 в 02:18
поделиться

, что вопрос представлял бы интерес для Вас?

я не уверен, почему uniqid() не работает на Вас и в том, какой случай Вам нужно уникальное число в той же миллисекунде, но не обязательно иначе; что Вы генерируете настолько быстро, что в той же миллисекунде у Вас могла быть коллизия? Я задаюсь вопросом, сколько время делает uniqid(), берет только для генерации его числа. Если Вы хотите, используйте параметр префикса эти uniqid() функция с несколькими случайными буквами, и необходимо быть в безопасности.

, Если это для генерации файла, Вы могли бы хотеть посмотреть tmpfile() или tempname() .

В любом случае, в зависимости от того, чего Вы пытаетесь достигнуть, можно просто циклично выполнить и проверить, взят ли уникальный идентификатор уже (в массиве, с file_exists, и т.д.), и просто генерируйте другой, если он имеет место.

<час>

кроме того, поскольку я не уверен, что понимаю Ваш вопрос точно, я указал бы на Вас на те другие вопросы, которые звучат довольно подобными, в то время как я получаю ваше различие:

первый будет представлять интерес, если Вы будете надеяться делать уникальный идентификатор, это человекочитаемо. Второй мог быть полезным, если Вы хотите играть со случайными числами и md5/sha1. Хотя, снова, я думаю uniqid(), мог бы уже быть тем, что Вы ищете.

0
ответ дан Community 27 November 2019 в 02:18
поделиться
Другие вопросы по тегам:

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