1*6777b538SAndroid Build Coastguard Worker# Choosing A Hash Function 2*6777b538SAndroid Build Coastguard Worker 3*6777b538SAndroid Build Coastguard Worker> Note: this document is still very much a work-in-progress. Currently missing: 4*6777b538SAndroid Build Coastguard Worker> - recommendations for hashed containers 5*6777b538SAndroid Build Coastguard Worker> - recommendations for a better persistent hash 6*6777b538SAndroid Build Coastguard Worker> - recommendations for a secure hash 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard WorkerIf a hash function with unchanging output is needed, please select from one of 9*6777b538SAndroid Build Coastguard Workerthe unchanging forever options below. 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker## Non-cryptographic 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Workername | input | output | unchanging forever | notes 14*6777b538SAndroid Build Coastguard Worker---------------------------------------------|-----------------------------|------------|--------------------|------- 15*6777b538SAndroid Build Coastguard Worker[`Hash()`][hash] | overloaded | `uint32_t` | no | This function is currently being updated to return `size_t`. 16*6777b538SAndroid Build Coastguard Worker[`PersistentHash()`][persistenthash] | overloaded | `uint32_t` | yes | Fairly weak but widely used for persisted hashes. 17*6777b538SAndroid Build Coastguard Worker[`CityHash64()`][cityhash64] | `base::span<const uint8_t>` | `uint64_t` | yes (note 1) | Version 1.0.3. Has some known weaknesses. 18*6777b538SAndroid Build Coastguard Worker[`CityHash64WithSeed()`][cityhash64withseed] | `base::span<const uint8_t>` | `uint64_t` | yes (note 1) | Version 1.0.3. Has some known weaknesses. 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker## Cryptographic 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker**There are no hashes in `//base` that provide cryptographic security.** 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker name | input | output | unchanging forever | notes 25*6777b538SAndroid Build Coastguard Worker-------------------------------|---------------|---------------|--------------------|------- 26*6777b538SAndroid Build Coastguard Worker[`MD5String()`][md5string] | `std::string` | `std::string` | yes | **INSECURE** 27*6777b538SAndroid Build Coastguard Worker[`SHA1HashString`][sha1string] | `std::string` | `std::string` | yes | **INSECURE** 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker## Deprecated 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker> Note: CRC32, Murmur2, and Murmur3 will be listed here. 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard WorkerNote 1: While CityHash is not guaranteed unchanging forever, the version used in 34*6777b538SAndroid Build Coastguard WorkerChrome is pinned to version 1.0.3. 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker[hash]: https://cs.chromium.org/chromium/src/base/hash/hash.h?l=26 37*6777b538SAndroid Build Coastguard Worker[persistenthash]: https://cs.chromium.org/chromium/src/base/hash/hash.h?l=36 38*6777b538SAndroid Build Coastguard Worker[cityhash64]: https://cs.chromium.org/chromium/src/base/hash/city_v103.h?l=19 39*6777b538SAndroid Build Coastguard Worker[cityhash64withseed]: https://cs.chromium.org/chromium/src/base/hash/city_v103.h?l=20 40*6777b538SAndroid Build Coastguard Worker[md5string]: https://cs.chromium.org/chromium/src/base/hash/md5.h?l=74 41*6777b538SAndroid Build Coastguard Worker[sha1string]: https://cs.chromium.org/chromium/src/base/hash/sha1.h?l=22 42