Examples tested against actual runtime. CI re-verifies continuously. Only documented examples are tested.
How to use
Install via yarn add locutus and import:
import { sha1_file } from 'locutus/php/strings/sha1_file'.
Or with CommonJS: const { sha1_file } = require('locutus/php/strings/sha1_file')
Use a bundler that supports tree-shaking so you only ship the functions you actually use.
Vite,
webpack,
Rollup, and
Parcel
all handle this. For server-side use this is less of a concern.
Examples
These examples are extracted from test cases that automatically verify our functions against their native counterparts.
#
code
expected result
1
sha1_file('test/never-change.txt')
'0ea65a1f4b4d69712affc58240932f3eb8a2af66'
Notes
Relies on file_get_contents which does not work in the browser, so Node only.
Keep in mind that in accordance with PHP, the whole file is buffered and then
hashed. We’d recommend Node’s native crypto modules for faster and more
efficient hashing
Dependencies
This function uses the following Locutus functions:
exportfunctionsha1_file(str_filename: string): string | false { // discuss at: https://locutus.io/php/sha1_file/ // parity verified: PHP 8.3 // original by: Kevin van Zonneveld (https://kvz.io) // note 1: Relies on file_get_contents which does not work in the browser, so Node only. // note 2: Keep in mind that in accordance with PHP, the whole file is buffered and then // note 2: hashed. We'd recommend Node's native crypto modules for faster and more // note 2: efficient hashing // example 1: sha1_file('test/never-change.txt') // returns 1: '0ea65a1f4b4d69712affc58240932f3eb8a2af66'
exportfunctionsha1_file(str_filename) { // discuss at: https://locutus.io/php/sha1_file/ // parity verified: PHP 8.3 // original by: Kevin van Zonneveld (https://kvz.io) // note 1: Relies on file_get_contents which does not work in the browser, so Node only. // note 2: Keep in mind that in accordance with PHP, the whole file is buffered and then // note 2: hashed. We'd recommend Node's native crypto modules for faster and more // note 2: efficient hashing // example 1: sha1_file('test/never-change.txt') // returns 1: '0ea65a1f4b4d69712affc58240932f3eb8a2af66'
const buf = fileGetContents(str_filename)
if (buf === false) { returnfalse }
returnsha1(buf) }
// php/filesystem/file_get_contents (Locutus dependency module) functionfile_get_contents(url, _flags, _context, _offset, _maxLen) { // discuss at: https://locutus.io/php/file_get_contents/ // original by: Legaev Andrey // input by: Jani Hartikainen // input by: Raphael (Ao) RUDLER // improved by: Kevin van Zonneveld (https://kvz.io) // improved by: Brett Zamir (https://brett-zamir.me) // bugfixed by: Brett Zamir (https://brett-zamir.me) // reimplemented by: Kevin van Zonneveld (https://kvz.io) // note 1: This used to work in the browser via blocking ajax // note 1: requests in 1.3.2 and earlier // note 1: but then people started using that for real app, // note 1: so we deprecated this behavior, // note 1: so this function is now Node-only // example 1: var $buf = file_get_contents('test/never-change.txt') // example 1: var $result = $buf.indexOf('hash') !== -1 // returns 1: true
return fs.readFileSync(url, 'utf-8') }
// php/strings/sha1 (Locutus dependency module) functionsha1(str) { // discuss at: https://locutus.io/php/sha1/ // parity verified: PHP 8.3 // original by: Webtoolkit.info (https://www.webtoolkit.info/) // improved by: Michael White (https://getsprink.com) // improved by: Kevin van Zonneveld (https://kvz.io) // input by: Brett Zamir (https://brett-zamir.me) // note 1: Keep in mind that in accordance with PHP, the whole string is buffered and then // note 1: hashed. If available, we'd recommend using Node's native crypto modules directly // note 1: in a steaming fashion for faster and more efficient hashing // example 1: sha1('Kevin van Zonneveld') // returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897'
const _cvtHex = function (val) { let str = '' let v = 0
for (let i = 7; i >= 0; i--) { v = (val >>> (i * 4)) & 0x0f str += v.toString(16) } return str }
let blockstart = 0 let j = 0 const W = newArray(80).fill(0) letH0 = 0x67452301 letH1 = 0xefcdab89 letH2 = 0x98badcfe letH3 = 0x10325476 letH4 = 0xc3d2e1f0 let A = 0 let B = 0 let C = 0 let D = 0 let E = 0 let temp = 0
for (blockstart = 0; blockstart < wordArray.length; blockstart += 16) { for (i = 0; i < 16; i++) { W[i] = wordArray[blockstart + i] ?? 0 } for (i = 16; i <= 79; i++) { W[i] = _rotLeft((W[i - 3] ?? 0) ^ (W[i - 8] ?? 0) ^ (W[i - 14] ?? 0) ^ (W[i - 16] ?? 0), 1) }
A = H0 B = H1 C = H2 D = H3 E = H4
for (i = 0; i <= 19; i++) { temp = (_rotLeft(A, 5) + ((B & C) | (~B & D)) + E + (W[i] ?? 0) + 0x5a827999) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp }
for (i = 20; i <= 39; i++) { temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + (W[i] ?? 0) + 0x6ed9eba1) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp }
for (i = 40; i <= 59; i++) { temp = (_rotLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + (W[i] ?? 0) + 0x8f1bbcdc) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp }
for (i = 60; i <= 79; i++) { temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + (W[i] ?? 0) + 0xca62c1d6) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp }
// php/strings/sha1_file (target function module) const fileGetContents = file_get_contents
functionsha1_file(str_filename) { // discuss at: https://locutus.io/php/sha1_file/ // parity verified: PHP 8.3 // original by: Kevin van Zonneveld (https://kvz.io) // note 1: Relies on file_get_contents which does not work in the browser, so Node only. // note 2: Keep in mind that in accordance with PHP, the whole file is buffered and then // note 2: hashed. We'd recommend Node's native crypto modules for faster and more // note 2: efficient hashing // example 1: sha1_file('test/never-change.txt') // returns 1: '0ea65a1f4b4d69712affc58240932f3eb8a2af66'
const buf = fileGetContents(str_filename)
if (buf === false) { returnfalse }
returnsha1(buf) }
Improve this function
Locutus is a community effort following
The McDonald's Theory:
we ship first iterations, hoping others will improve them.
If you see something that could be better, we'd love your contribution.