@@ -43,6 +43,7 @@ use rustc_macros::{Decodable, Encodable, HashStable_Generic};
43
43
use rustc_serialize:: opaque:: { FileEncoder , MemDecoder } ;
44
44
use rustc_serialize:: { Decodable , Decoder , Encodable , Encoder } ;
45
45
use tracing:: debug;
46
+ use xxhash_rust:: xxh3;
46
47
47
48
mod caching_source_map_view;
48
49
pub mod source_map;
@@ -1458,14 +1459,25 @@ pub enum SourceFileHashAlgorithm {
1458
1459
Md5 ,
1459
1460
Sha1 ,
1460
1461
Sha256 ,
1462
+ XxHash ,
1463
+ }
1464
+
1465
+ impl SourceFileHashAlgorithm {
1466
+ pub fn supported_in_cargo ( & self ) -> bool {
1467
+ match self {
1468
+ Self :: Md5 | Self :: Sha1 => false ,
1469
+ Self :: Sha256 | Self :: XxHash => true ,
1470
+ }
1471
+ }
1461
1472
}
1462
1473
1463
1474
impl Display for SourceFileHashAlgorithm {
1464
1475
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
1465
1476
f. write_str ( match self {
1466
- SourceFileHashAlgorithm :: Md5 => "md5" ,
1467
- SourceFileHashAlgorithm :: Sha1 => "sha1" ,
1468
- SourceFileHashAlgorithm :: Sha256 => "sha256" ,
1477
+ Self :: Md5 => "md5" ,
1478
+ Self :: Sha1 => "sha1" ,
1479
+ Self :: Sha256 => "sha256" ,
1480
+ Self :: XxHash => "xxhash" ,
1469
1481
} )
1470
1482
}
1471
1483
}
@@ -1478,6 +1490,7 @@ impl FromStr for SourceFileHashAlgorithm {
1478
1490
"md5" => Ok ( SourceFileHashAlgorithm :: Md5 ) ,
1479
1491
"sha1" => Ok ( SourceFileHashAlgorithm :: Sha1 ) ,
1480
1492
"sha256" => Ok ( SourceFileHashAlgorithm :: Sha256 ) ,
1493
+ "xxhash" => Ok ( SourceFileHashAlgorithm :: XxHash ) ,
1481
1494
_ => Err ( ( ) ) ,
1482
1495
}
1483
1496
}
@@ -1517,6 +1530,9 @@ impl SourceFileHash {
1517
1530
SourceFileHashAlgorithm :: Sha256 => {
1518
1531
value. copy_from_slice ( & Sha256 :: digest ( data) ) ;
1519
1532
}
1533
+ SourceFileHashAlgorithm :: XxHash => {
1534
+ value. copy_from_slice ( & xxh3:: xxh3_128 ( data) . to_be_bytes ( ) ) ;
1535
+ }
1520
1536
} ;
1521
1537
hash
1522
1538
}
@@ -1551,6 +1567,16 @@ impl SourceFileHash {
1551
1567
}
1552
1568
1553
1569
match kind {
1570
+ SourceFileHashAlgorithm :: XxHash => {
1571
+ digest (
1572
+ xxh3:: Xxh3 :: new ( ) ,
1573
+ |h, b| h. update ( b) ,
1574
+ |h, out| out. copy_from_slice ( & h. digest128 ( ) . to_be_bytes ( ) ) ,
1575
+ src,
1576
+ & mut buf,
1577
+ value,
1578
+ ) ?;
1579
+ }
1554
1580
SourceFileHashAlgorithm :: Sha256 => {
1555
1581
digest (
1556
1582
Sha256 :: new ( ) ,
@@ -1607,6 +1633,7 @@ impl SourceFileHash {
1607
1633
SourceFileHashAlgorithm :: Md5 => 16 ,
1608
1634
SourceFileHashAlgorithm :: Sha1 => 20 ,
1609
1635
SourceFileHashAlgorithm :: Sha256 => 32 ,
1636
+ SourceFileHashAlgorithm :: XxHash => 16 ,
1610
1637
}
1611
1638
}
1612
1639
}
0 commit comments