Обновление, март 2014:
Во-первых, важно отметить, что uniqid
является немного неправильным, поскольку он не гарантирует уникальный идентификатор.
ВНИМАНИЕ!
Эта функция не создает случайную или непредсказуемую строку. Эта функция не должна использоваться в целях безопасности. Использовать криптографически безопасную случайную функцию / генератор и криптографически защищенные хэш-функции для создания непредсказуемого безопасного идентификатора.
blockquote>И
Эта функция не генерирует криптографически защищенные токены, в факт без каких-либо дополнительных параметров, возвращаемое значение мало отличается от microtime () . Если вам нужно генерировать криптографически безопасные маркеры, используйте openssl_random_pseudo_bytes () .
blockquote>Установка большей энтропии в true генерирует более уникальное значение, однако время выполнения (хотя и в малой степени), согласно документам:
Если установлено значение TRUE, uniqid () добавит дополнительную энтропию (используя объединенный линейный конгруэнтный генератор) в конце возвращающее значение, что увеличивает вероятность того, что результат будет уникальным.
blockquote>Обратите внимание на строку
increases the likelihood that the result will be unique
, а не на то, что гарантирует уникальность .Вы можете «бесконечно» стремиться к уникальности, вплоть до точки и улучшать с помощью любого количества процедур шифрования, добавляя соли и т.п. - это зависит от цели.
Я бы рекомендовал посмотреть комментарии к основной теме PHP, в частности:
http://www.php.net/manual/en/function.uniqid.php#96898
http://www.php.net/manual/en/function.uniqid.php # 96549
http://www.php.net/manual/en/function.uniqid.php#95001
Что я «Рекомендую выработать , почему вам нужна уникальность, это для безопасности (т. е. добавить в процедуру шифрования / скремблирования)? Кроме того, Как уникально это нужно? Наконец, посмотрите на скорость рассмотрения. Пригодность изменится с учетом основных соображений.
Использование однострочного Perl
perl -0777 -pe ' s/(<Product ID=\"(\S+)\".+?<Name>)(.+?)</$1$2</msg '
С заданными входами
$ cat navku.xml
<Products>
<Product ID="ABC1234" UserID="XYX" SUperUserID="ROOT" >
<Name>1234</Name>
<Values>
<Value AttributeID="A">1</Value>
<Value AttributeID="B">00</Value>
</Values>
</Product>
<Product ID="XYZ1234" UserID="XYX" SUperUserID="ROOT" >
<Name>1234</Name>
<Value AttributeID="A">4</Value>
<Value AttributeID="B">10</Value>
</Values>
</Product>
$ perl -0777 -pe ' s/(<Product ID=\"(\S+)\".+?<Name>)(.+?)</$1$2</msg ' navku.xml
<Products>
<Product ID="ABC1234" UserID="XYX" SUperUserID="ROOT" >
<Name>ABC1234</Name>
<Values>
<Value AttributeID="A">1</Value>
<Value AttributeID="B">00</Value>
</Values>
</Product>
<Product ID="XYZ1234" UserID="XYX" SUperUserID="ROOT" >
<Name>XYZ1234</Name>
<Value AttributeID="A">4</Value>
<Value AttributeID="B">10</Value>
</Values>
</Product>
$
РЕДАКТИРОВАТЬ: В случае, если в соответствии с комментарием OP, если в строке содержится более "
значений, я выбираю самое первое значение в диапазоне от "
до "
.
awk -F'[>"<]' '
/Product ID/{
match([110],/"[^"]*/)
val=substr([110],RSTART+1,RLENGTH-1)
}
/<Name>/{
sub(/>.*</,">"val"<")
}
1' Input_file
Вывод после запуска вышеуказанного кода выглядит следующим образом:
awk -F'[>"<]' '
/Product ID/{
match([111],/"[^"]*/)
val=substr([111],RSTART+1,RLENGTH-1)
}
/<Name>/{
sub(/>.*</,">"val"<")
}
1' Input_file
<Products>
<Product ID="ABC1234" UserID="XYX" SUperUserID="ROOT" >
<Name>ABC1234</Name>
<Values>
<Value AttributeID="A">1</Value>
<Value AttributeID="B">00</Value>
</Values>
</Product>
<Product ID="XYZ1234" UserID="XYX" SUperUserID="ROOT" >
<Name>XYZ1234</Name>
<Value AttributeID="A">4</Value>
<Value AttributeID="B">10</Value>
</Values>
</Product>
Не могли бы вы попробовать следующее.
awk -F'[>"<]' '
/Product ID/{
match([112],/".*"/)
val=substr([112],RSTART+1,RLENGTH-2)
}
/<Name>/{
sub(/>.*</,">"val"<")
}
1' Input_file