1) password_hash
Vývojáři PHP nejsou žádní blbci. Kdyby nebylo použitelné a vhodné to, co je v password_hash, tak by tam bylo něco jiného.
Teď je tam to co je a podle mě je to použitelné a vhodné.
Je ten algoritmus bezpečný a je ta délka řetězce dostatečná vůči prolomení tímto způsobem? Obojí ano.
Další věc je prolomení hrubou silou, což je vpodstatě jediný způsob jak hash prolomit. Záleží tedy i na rychlosti ověřování. V manuálu k té funkci je zmíněn čas 50 ms. Asi je ten čas +- vhodný. Čím je ten čas větší, tím je to bezpečnější, ale zase to může vadit z hlediska funkcionality webu. Defaultní cost 10 na mém hardwaru dělá asi 47 ms. Cost 12 asi 184 ms (12 se běžně reálně používá pokud to chce mít člověk bezpečnější). Cost 16 asi 2940 ms a to už by uživatelsky asi moc příjemné nebylo. Hodnoty jde nastavit 04 - 31. A i ta defaultní 10 by měla zajistit relativní bezpečnost, proto tam je jako default.
2) "Jak v PHP vygenerovat string" ... "když tajné heslo bude mít třeba jen 4 znaky"
Někdo, kdo se ptá takto, podle mě neví co dělá a je pro něj nejvhodnější password_hash.
Jasně, vygenerovat string... 100, 500 znaků... Jestli to má být vůči prolomení, proč nestačí délka, která se bežně používá? Podle mě stačí a je to úplně stejně bezpečné. Daleko důležitější je vhodnost algoritmu, respektive aby ověřování probíhalo v optimálním čase. Řeší to? Neřeší. Podle mě tvůj i můj způsob je hodně rychlý a k tomu prolomení čtyřznakového hesla (počítám 118 možných znaků) by došlo během několika sekund hrubou silou. Ale to je jedno, on to přece neřeší, otázka zněla "Jak v PHP vygenerovat string".
3) V těch odkazech ten převod z hex na dec a dec na xyz je brutálně rychlý, pod 1 ms. Testováno na číslech z sha3-512 hashe, např. 1E+154 (jako jednička a 154 nul).
4) Pokud nemá nějaký extra důvod nepoužívat password_hash, tak ať použije password_hash