gpt4 book ai didi

javascript - 具有确定(少量)变体的哈希/摘要

转载 作者:可可西里 更新时间:2023-11-01 12:59:47 24 4
gpt4 key购买 nike

我只需要从字符串中获取 16 个(或其他少量)可能的哈希值,以便根据联系人姓名对联系人进行颜色编码。

我曾尝试获取 crc32 哈希值,然后取第一个符号,即十六进制数字:

$contact = 'Robin Hood';
$colors = [
'0' => 'F8BBD0',
'1' => 'E1BEE7',
...
'e' => 'D7CCC8',
'f' => 'CFD8DC',
];
$firstLetter = hash('crc32', $contact)[0];
return '#' . $colors[$firstLetter];

但是,我对这种方法的良好分布表示怀疑。如何从字符串中获取少量且确定数量的变体摘要?

最佳答案

如果您主要关心的是良好的分布,我会使用一个好的伪随机引擎:

$colorKey = bin2hex(openssl_random_pseudo_bytes(1))[0];
return '#' . $colors[$colorKey];

我不能说这与哈希的第一个字符的分布相比如何,但这肯定会很好地满足您的目的。


编辑: 由于您需要散列,我针对包含 500 个随机名称的文本文件测试了各种散列,发现 crc32 具有最均匀的分布。我不知道你期望有多少个名字或你需要多好的发行版,但你的解决方案对我来说似乎是一个不错的选择:

<?php
function sd_square($x, $mean) { return pow($x - $mean,2); }

function sd($array) {
return sqrt(array_sum(array_map("sd_square", $array, array_fill(0,count($array), (array_sum($array) / count($array)) ) ) ) / (count($array)-1) );
}

$crcColorCounts = array_fill_keys(range(0, 15), 0);
$file = fopen('random_names.txt', 'r');
while ($contact = fgets($file)) {
$hash = hash('crc32', $contact);
$letter = $hash[0];
$crcColorCounts[hexdec($letter)]++;
}
fclose($file);
print_r($crcColorCounts);
echo 'Standard deviation: ', sd($crcColorCounts);

输出:

Array
(
[0] => 32
[1] => 26
[2] => 33
[3] => 31
[4] => 40
[5] => 29
[6] => 33
[7] => 20
[8] => 33
[9] => 30
[10] => 39
[11] => 27
[12] => 36
[13] => 33
[14] => 29
[15] => 30
)
Standard deviation: 4.8815127436755

(标准差函数取自 this answer 。)

我还尝试了 MD5、SHA1 和 CRC32 的最后一个字符。所有返回的标准差都在 7 左右,使 CRC32 的第一个字符成为赢家。

关于javascript - 具有确定(少量)变体的哈希/摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36327734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com