blob: e06bdcf195295f0150b6b0b947e6d8f70a0cc071 [file] [log] [blame] [edit]
// Copyright (C) 2023 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
export function hash(s: string, max: number): number {
let hash = 0x811c9dc5 & 0xfffffff;
for (let i = 0; i < s.length; i++) {
hash ^= s.charCodeAt(i);
hash = (hash * 16777619) & 0xffffffff;
}
return Math.abs(hash) % max;
}
/**
* Computes the SHA-1 of a string or ArrayBuffer(View)
* @param data a string or ArrayBuffer to hash.
*/
export async function sha1(data: string | ArrayBuffer): Promise<string> {
let buffer: ArrayBuffer;
if (typeof data === 'string') {
buffer = new TextEncoder().encode(data);
} else {
buffer = data;
}
const digest = await crypto.subtle.digest('SHA-1', buffer);
return digestToHex(digest);
}
/**
* Converts the return value of crypto.digest() to a hex string.
* @param digest an array of bytes containing the digest
* @returns hex-encoded string of the digest.
*/
export function digestToHex(digest: ArrayBuffer): string {
return Array.from(new Uint8Array(digest))
.map((x) => x.toString(16).padStart(2, '0'))
.join('');
}