2018-05-11 17:19 GMT+02:00 Alice Wonder <al...@librelamp.com>: > On 05/11/2018 05:34 AM, Alice Wonder wrote: > >> On 05/11/2018 05:10 AM, Alice Wonder wrote: >> >>> On 05/11/2018 03:50 AM, Arvids Godjuks wrote: >>> >>>> 2018-05-11 12:36 GMT+02:00 Alice Wonder <al...@librelamp.com>: >>>> >>>> On 05/11/2018 01:59 AM, Arvids Godjuks wrote: >>>>> >>>>> 2018-05-10 16:33 GMT+02:00 Niklas Keller <m...@kelunik.com>: >>>>>> >>>>>> Hey, >>>>>> >>>>>>> >>>>>>> I hereby propose to deprecate uniqid(). There have been attempts to >>>>>>> fix >>>>>>> it >>>>>>> ( >>>>>>> https://wiki.php.net/rfc/uniqid), but those were rejected during >>>>>>> discussion, because there's no possible fix without breaking BC. >>>>>>> Instead >>>>>>> of >>>>>>> a subtle BC break, this RFC favors the deprecation and moving >>>>>>> users to >>>>>>> other functions. >>>>>>> >>>>>>> It's to be discussed whether the function should be removed with >>>>>>> PHP 8.0 >>>>>>> or >>>>>>> just deprecated to avoid fully breaking things where it's not >>>>>>> strictly >>>>>>> necessary. A deprecation will probably avoid most new usages, >>>>>>> which is >>>>>>> the >>>>>>> main goal. >>>>>>> >>>>>>> RFC: https://wiki.php.net/rfc/deprecate-uniqid >>>>>>> >>>>>>> Kind Regards, >>>>>>> Niklas >>>>>>> >>>>>>> -- >>>>>>> PHP Internals - PHP Runtime Development Mailing List >>>>>>> To unsubscribe, visit: http://www.php.net/unsub.php >>>>>>> >>>>>>> >>>>>>> Hello, >>>>>>> >>>>>> >>>>>> as a userland user of this function I do disagree with it's outright >>>>>> removal. It has it's uses. >>>>>> What can be done with it is drop the $more_entropy flag and make it >>>>>> generate at least as long strings and use random_bytes under the >>>>>> hood for >>>>>> a >>>>>> better random. >>>>>> It can also adopt a length parameter so you can vary the random >>>>>> part as >>>>>> much as you need it. >>>>>> >>>>>> You don't always need a truly random token - I have a system that uses >>>>>> uniqid to generate tens of thousands tokens per request and it's >>>>>> actually >>>>>> a >>>>>> good thing they are time based at the start of it with a random >>>>>> part at >>>>>> the >>>>>> end (as I said the random part should be improved and get rid of that >>>>>> stupid dot when generating with $more_entropy = true). >>>>>> >>>>>> >>>>>> It seems to me that for your use case, you could just use the time() >>>>> function to get part of your unique id and then use libsodium to >>>>> generated >>>>> a nonce for the "random" part, using sodium's function for increment >>>>> the >>>>> nonce between each use. >>>>> >>>>> Predictable, sure, but your use case says they don't need to be a truly >>>>> random token - just unique (essentially a non-random nonce) but with >>>>> a time >>>>> component. >>>>> >>>>> >>>>> -- >>>>> PHP Internals - PHP Runtime Development Mailing List >>>>> To unsubscribe, visit: http://www.php.net/unsub.php >>>>> >>>>> >>>>> Hello Alice, >>>> >>>> Sure, there is lots I can do about that project, including what you have >>>> described. One thing though - client does not need it or want it or >>>> want's >>>> to pay for that work. That whole project is a poster child for a "side >>>> project on a bare minimum, but done by a competent developer instead >>>> of a >>>> student so it actually works in the long run" >>>> >>>> >>> Tell the client they can use this for free. >>> >>> function compat_uniqid(string $prefix='', bool $more_entropy = false) >>> { >>> static $nonce = null; >>> if(is_null($nonce)) { >>> $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); >>> } >>> $m = microtime(true); >>> $return = sprintf("%8x%05x",floor($m),($m-floor($m))*1000000); >>> if($more_entropy) { >>> sodium_increment($nonce); >>> $x = hexdec(substr(bin2hex($nonce),0,8)); >>> $x = str_pad($x, 12, "0", STR_PAD_LEFT); >>> $return = $return . substr($x, 0, 1) . '.' . substr($x, -8); >>> } >>> return $prefix . $return; >>> } >>> >>> >> slightly better if block >> >> if($more_entropy) { >> sodium_increment($nonce); >> $x = hexdec(substr(bin2hex($nonce),0,12)); >> $return = $return . substr($x, 2, 1) . '.' . substr($x, -8); >> } >> >> Obvious patterns in the "more entropy" but the output in only suppose to >> be unique, not random. >> >> > If you don't need the output to be exact same format, this avoids > collisions and is faster. > > function cryptoUniqid(string $prefix = '', bool $prng = false): string > { > static $nonce = null; > if($prng || is_null($nonce)) { > $nonce = random_bytes(16); > } else { > sodium_increment($nonce); > } > $m = microtime(true); > $return = sprintf("%8x%05x", floor($m), ($m-floor($m))*1000000); > $return = $return . '.' . base64_encode($nonce); > return $prefix . $return; > > } > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > >
Thank you for all the advice Alice :) -- Arvīds Godjuks +371 26 851 664 arvids.godj...@gmail.com Skype: psihius Telegram: @psihius https://t.me/psihius